关于MySQL的表最多能建多少个索引

关于MySQL的表最多能建多少个索引,第1张

老实说,看到这个问题的瞬间我是有点懵的状态,我原本只只知道Innodb引擎的表,最多只有1017列(至于为什么不是1024,可以百度一下), 下意识地就觉得索引最多可以创建1017个,但是仔细一想,不对啊, 索引可以是复合索引啊,那绝对不止1017,难道索引的数量会是1个很大的数据吗? 再仔细想想,以Innodb的抠门个性,不可能会是1个大的数值,然后去翻了下官方文档,看到如下内容。 This section describes limits for InnoDB tables, indexes, tablespaces, and other aspects of the InnoDB storage engine. 上面就清楚地写着, 1个表最大只能创建64个2级索引。 加上主键,那么上面的问题就有了答案,65个。 我试着填了65 的答案上去之后,点击提交,网站给我的回复是错误,我花了1个积分查看了正确答案【我回答是为了赚积分,没想到还赔了1个积分!!】 网站给的答案是:16. 纳尼! 怎么比官方的64还低! 然后我往刚才官方文档下面拉一拉,发现看了一个跟16的数字有关的描述: A maximum of 16 columns is permitted for multicolumn indexes. Exceeding the limit returns an error. ERROR 1070 (42000): Too many key parts specifiedmax 16 parts allowed 上面写的是,复合索引最多只能16列,超过就会报错。 有意思的是,然后我又在百度上搜索了相关的问题,没想到好几个答案都是写着16,我觉得16的应该是被别人给误导了,这个网站出题的这个作者,应该 也是百度了下,看到答案是16就给了个16的答案。 有心反馈这个问题,可惜没有渠道反馈,然后就在这里写下一点心得,关于技术的东西,发现有疑问或者怀疑的时候, 还是得翻一翻官方文档为好,起码能保证不会出错。

首先是两个表, user_info 和 user_identify_info ,这两个表通过 user_id 关联。

user_info 中 user_id 字段是int(11)类型,主键索引

user_identify_info 中 user_id 是varchar类型,普通索引

执行结果如图,未使用到索引

将 user_identify_info 字段改为int(11)或者bigint类型,使用到索引

最后查到

1、字段是varchar类型,参数是int类型,不走索引

2、字段是varchar类型,参数是字符串,走索引

3、字段是int类型,参数是int类型,走索引

4、字段是int类型,参数是字符串,走索引

添加列delivery_address 字段扩展到1000

为这个字段添加单列索引,报异常出来,索引最大长度是3072 bytes

mysql5.7不报错,但会自动将索引长度限制在768

mysql8单列索引最长也是768

复合索引总长度不能超过768

由于历史原因,MySQL刚开始设计的时候,"天真的"认为使用3个字节就足够存储字符串了,因此将UTF-8进行阉割然而遇到复杂的汉字或者emoji表情等4字节的宽字符的时候,存储就会出现异常,因此在版本5.7.3开始引入utf8mb4,其表示为most bytes 4,即最多占用4个字节。

utf8mb4_unicode_ci是基于官方的Unicode规则进行排序和压缩,其算法相对负责,对于大部分的语言和字符集排序有着很高的准确率而uft8mb4_general_ci可以理解为一种为了提升速度的简化版Unicode规则,但由于它不完全遵循Unicode规则,在使用某种特定语言或者字符集时,会出现非预期的结果。

例:

总结:

UTF-8编码的字符可以是1-4个字节,但是在MySQL中最大只能存储3个字节。

在版本5.5开始引入innodb_large_prefix,其默认值为off,索引的前缀最大限制为767个字节;若值为on时(版本5.7.7开始作为默认值),最大限制为3072个字节。

总结:

在后期版本 innodb_large_prefix 将会被逐渐废弃并移除。从版本8.0开始,索引长度限制由表字段(row format)决定,若为DYNAMIC或COMPRESSED时,限制值为3072;为REDUNDANT或COMPACT时,限制值为767。且row_format=dynamic时,长度3072是基于innodb_page_size=16KB,随着innodb_page_size的值按比例增减,其索引前缀长度也响应减小,如若为8KB时,长度为1536,因此在限制索引长度时,需根据使用的MySQL版本以及相应的参数进行配置决定。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6159025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存