有关MySQLInnoDB在索引中自动添加主键的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了有关MySQLInnoDB在索引中自动添加主键的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1500字,纯文字阅读大概需要3分钟。
内容图文
![有关MySQLInnoDB在索引中自动添加主键的问题](/upload/InfoBanner/zyjiaocheng/548/294c40ef8330478ca5aa7897b9f98592.jpg)
只要用户定义的索引字段中包含了主键中的字段、那么这个字段就不会再被InnoDB自动加到索引中。但如果用户的索引字段中没有完全包
㈠ 原理:
只要用户定义的索引字段中包含了主键中的字段、那么这个字段就不会再被InnoDB自动加到索引中
但如果用户的索引字段中没有完全包含主键字段、InnoDB 就会把剩下的主键字段加到索引末尾
㈡ 例子
例子一:
CREATE TABLE t (
a char(32) not null primary key,
b char(32) not null,
KEY idx1 (a,b),
KEY idx2 (b,a)
) Engine=InnoDB;
idx1 和 idx2 两个索引内部大小完全一样、没有区别
例子二:
CREATE TABLE t (
a char(32) not null,
b char(32) not null,
c char(32) not null,
d char(32) not null,
PRIMARY KEY (a,b)
KEY idx1 (c,a),
KEY idx2 (d,b)
) Engine=InnoDB;
这个表 InnoDB 会自动补全主键字典、idx1 实际上内部存储为 (c,a,b),idx2 实际上内部存储为 (d,b,a)
但是这个自动添加的字段、Server 层是不知道的、所以 MySQL 优化器并不知道这个字段的存在、那么如果你有一个查询:
SELECT * FROM t WHERE d=x1 AND b=x2 ORDER BY a;
其实内部存储的 idx2(d,b,a) 可以让这个查询完全走索引、但是由于 Server 层不知道、
所以最终 MySQL优化器 可能选择 idx2(d,b) 做过滤然后排序 a 字段、或者直接用PK扫描避免排序
而如果我们定义表结构的时候就定义为 KEY idx2(d,b,a) 、那么 MySQL 就知道(d,b,a)三个字段索引中都有、
并且 InnoDB 发现用户定义的索引中包含了所有的主键字段、也不会再添加了、并没有增加存储空间
㈢ 建议
因此、由衷的建议、所有的 MySQL DBA 建索引的时候、都在业务要求的索引字段后面补上主键字段、
这没有任何损失、但是可能给你带来意外的惊喜哦
内容总结
以上是互联网集市为您收集整理的有关MySQLInnoDB在索引中自动添加主键的问题全部内容,希望文章能够帮你解决有关MySQLInnoDB在索引中自动添加主键的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。