MySQL之最

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 最大和最小 一个表里最多可有1017列(在MySQL 5.6.9 之前最大支持1000列)。虚拟列也受限这个限制。 一个表最多可以有64个二级索引。 如果innodb_large_prefix打开,在InnoDB表DYNAMIC或COMPRESSED列格式下,索引前缀最大支持前3072字节;如果不打开的话,在任意列格式下,最多支持前767字节。

最大和最小

  1. 一个表里最多可有1017列(在MySQL 5.6.9 之前最大支持1000列)。虚拟列也受限这个限制。
  2. 一个表最多可以有64个二级索引。
  3. 如果innodb_large_prefix打开,在InnoDB表DYNAMIC或COMPRESSED列格式下,索引前缀最大支持前3072字节;如果不打开的话,在任意列格式下,最多支持前767字节。 这个限制既适用于前缀索引也适用于全列索引。
  4. 基于一个16KB的页最多装3072个字节,如果你把InnoDB 的page 大小从8KB降到4KB,索引的长度也相应的降低。也就是说,当页是8KB的时候最大索引长度是1536字节;当页大小是4KB的时候最大索引长度是768字节;
  5. 联合索引最多支持16列,如果超过这个限制就会遇到以下错误:
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
AI 代码解读
  1. 行长度(除去可变长类型:VARBINARY/VARCHAR/BLOB/TEXT),要小于页长(如4KB, 8KB, 16KB, and 32KB)的一半。
    例如:innodb_page_size 长度是16KB的话,行长不超过8KB;如果innodb_page_size 是64KB的话,行长不超过16KB; LONGBLOB/LONGTEXT/BLOB/TEXT列必须小于4GB,整个行长也必须小于4GB。

如果一行小于一页的一半,它可以存在一个page里面。如果超过了页的一半,就会把可变长列放到额外的页存(如果对这个感兴趣的话可以看看, MySQL页管理)。

  1. 虽然InnoDB内部支持行长大于65,535字节,但是MySQL限制了所有列的组合长度(如果对这个感兴趣的话可以看看, 表的列大小和行长)。 例如:
mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),   
    -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),   
    -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;
ERROR 1118 (42000): Row size too large. The maximum row size for the
used table type, not counting BLOBs, is 65535. You have to change somecolumns to TEXT or BLOBs
AI 代码解读
  1. 在一些老操作系统中,文件必须小于2GB。这并非是InnoDB本身的限制,如果你需要大的表空间,就要配置使用几个小的数据文件而不是一个大的数据文件。
  2. InnoDB日志文件组合大小最大可以是512GB。
  3. 最小的表空间是10MB,最大的表空间取决于InnoDB页大小(最大表空间也就是最大表大小)。
    InnoDB表空间大小
InnoDB页大小 最大表空间
4KB 16TB
8KB 32TB
16KB 64TB
32KB 128TB
64KB 256TB

默认InnoDB页大小是16KB,你可以在创建一个实例的时候,修改配置文件里面这个innodb_page_size来提高或降低页大小。
在 Barracuda文件格式下,ROW_FORMAT=COMPRESSED最大支持page_size 16KB。

除了ROW_FORMAT=COMPRESSED最大page size只能是16KB以外,可以配置page size是32KB或者64KB。当page size是32KB或者64KB的时候,最大记录长度是16KB。当 innodb_page_size=32k时,扩展长度是2MB;当 innodb_page_size=64k时,扩展长度是4MB。

一个MySQL实例只能指定1个innodb_page_size,而不能根据数据文件或者日志文件定制这些文件的innodb_page_size。

表和事务

  1. 如果innodb_table_locks=1的话,lock tables需要在每个表上加两把锁。除了在MySQL Server层的表锁,还需要再InnoDB层也加锁。在MySQL 4.1.2之前的版本,不需要InnoDB层的表锁;可以通过设置innodb_table_locks=0选择老的表设定方式。如果没有获取InnoDB层的表锁,即使某些记录被其他事务锁定,lock tables也可以完成。 在MySQL 5.7,innodb_table_locks=0 就会对lock tables ... write显示锁定不起作用。但是通过 lock tables ... writes加隐式锁(比如:触发器) 或者 lock tables ... read加锁,对读或写确实有作用。 2.所有的InnoDB锁都被事务持有,当这个事务已经提交或者回滚的时候,InnoDB的锁就会被释放。所以,在autocommit=1模式下,在InnoDB表上执行lock table没多大意义,因为获取的InnoDB表锁会被立即释放。
  2. LOCK TABLES执行隐式commit和unlock table,所以在(锁表)事务过程中你不能再锁其他的表了。
  3. 数据修改事务的上限是96*1023个并发事务(undo记录)。在128个回滚段中的32个都被分配给了非redo日志(这些日志是由修改临时表和相关对象事务产生)。这样就把并发修改数据事务的上限从128K降到了96K。这96K限制的是修改非临时表的事务上限。如果所有的修改数据事务都是修改临时表的话,上限是32K个并发事务。

参考资料:
https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
9104
分享
相关文章
《MySQL自传》
我是一只勤劳的小海豚,网名叫MySQL,出生于1995年5月23号,正宗95后,你们可别小看我,我现在可是全世界最流行的开源数据库,全球有800万个实例呢。
1145 2
《MySQL自传》
mysql
```sql 使用MySQL查询比数学系所有学生年龄大的学生姓名和所在系。代码如下: use teachingdb; SELECT sname, sdept, birthday FROM student WHERE birthday < ALL (SELECT birthday FROM student WHERE sdept = '数学'); ``` 摘要:该任务是查询比数学系学生年龄大的所有学生信息,包括姓名和所在系。通过在SQL中使用ANY/ALL操作符与子查询结合,这里选用ALL与MAX()函数等效,找出比数学系学生最晚出生日期还要早的所有学生。
60 0
MySQL灵魂100问,你能答出多少?
推荐阅读: 面试机会不等人,资料看精不看多!史上最全Java技术资料合集! 2019年中总结,400道一线大厂高频精选面试题合集(JVM+Spring+RabbitMQ+Mybatis+Redis+分布式+微服务) 整理完今年的阿里、腾讯、网易等公司的面试后,我有一个重大发现 .
1695 0
JavaWeb基础1——MySQL
SQL语句、DDL、DML、DQL(分组查询、子查询等)、Navicat、约束、 一对多等数据库设计、多表查询(联合查询/连接查询)、事务、函数
JavaWeb基础1——MySQL
mysql5.0认识总结
mysql5.0认识了一个星期,想总结一下   第一步: 认识了mysql5.0的安装,修改密码,建数据库,导入和导出; 导入和导出:具体操作的过程,现在数据库中建一个库,再建个表,然后#mysqldump -uroot -p --opt 库名>备份的名字.sql; 导入时先建库名,#mysqladmin -uroot -p create 库名;               
1025 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等