数据库|mysql教程
用户
数据库-mysql教程
手机怎么搭建网站源码,vscode设置执行路径,ubuntu 16 目录,哪个公司在用tomcat,手机爬虫案件,iis php curl,包装seo优化怎么做,php网站源代码大量php文件,织梦会员中心最新文档模板下载lzw
有关MySQL InnoDB在索引中自动添加主键的问题
球球棒棒糖接口源码,vscode启动速度,ubuntu网站是什么,tomcat 无法响应,sqlite新建table,shopnc uc整合插件,前端开发是框架吗,网络爬虫 demo,php的配置文件是,c seo,简易个人网站源代码,java 网页绘图,手机html5电商模板下载,微信查看页面源代码,mvc仓库管理系统源码,二手车交易网站程序源码lzw
㈠ 原理:
播放器控件源码,ubuntu粘贴回车命令,爬虫菠菜公司数据,hahoop php,乐昌seo引流lzw
只要用户定义的索引字段中包含了主键中的字段、那么这个字段就不会再被InnoDB自动加到索引中
但如果用户的索引字段中没有完全包含主键字段、InnoDB 就会把剩下的主键字段加到索引末尾
㈡ 例子
例子一:
[sql]
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 两个索引内部大小完全一样、没有区别
例子二:
[sql]
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 优化器并不知道这个字段的存在、那么如果你有一个查询:
[sql]
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 建索引的时候、都在业务要求的索引字段后面补上主键字段、
这没有任何损失、但是可能给你带来意外的惊喜哦
如果觉得《有关MySQL InnoDB在索引中自动添加主键的问题【MySQL】》对你有帮助,请点赞、收藏,并留下你的观点哦!