前言
之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。
什么时候创建组合索引"color: #ff0000">为什么不对没一列创建索引
- 减少开销
- 覆盖索引
- 效率高
减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引
覆盖索引:假如查询SELECT col1, col2, col3 FROM 表名,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询
效率高:对col1、col2、col3三列分别创建索引,MySQL只会选择辨识度高的一列作为索引。假设有100w的数据,一个索引筛选出10%的数据,那么可以筛选出10w的数据;对于组合索引而言,可以筛选出100w*10%*10%*10%=1000条数据
最左匹配原则
假设我们创建(col1,col2,col3)这样的一个组合索引,那么相当于对col1列进行排序,也就是我们创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引
创建测试表
CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar(10) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `idx_id_name_age` (`id`,`name`,`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
填充100w测试数据
DROP PROCEDURE pro10; CREATE PROCEDURE pro10() BEGIN DECLARE i INT; DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE age INT; SET i = 1; WHILE i < 5000000 do SET return_str = substring(char_str, FLOOR(1 + RAND()*62), 8); SET i = i+1; SET age = FLOOR(RAND() * 100); INSERT INTO student(id, name, age) values(i, return_str, age); END WHILE; END; CALL pro10();
场景测试
EXPLAIN SELECT * FROM student WHERE id = 2;
可以看到该查询使用到了索引
EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk';
可以看到该查询使用到了索引
EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8;
可以看到该查询使用到了索引
EXPLAIN SELECT * FROM student WHERE id = 2 AND age = 8;
可以看到该查询使用到了索引
EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND age = 8;
可以看到该查询没有使用到索引,类型为index,查询行数为4989449,几乎进行了全表扫描,由于组合索引只针对最左边的列进行了排序,对于name、age只能进行全部扫描
EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND id = 2; EXPLAIN SELECT * FROM student WHERE age = 8 AND id = 2; EXPLAIN SELECT * FROM student WHERE name = 'defghijk' and age = 8 AND id = 2;
可以看到如上查询也使用到了索引,id放前面和放后面查询到的结果是一样的,MySQL会找出执行效率最高的一种查询方式,就是先根据id进行查询
总结
如上测试,可以看到只要查询条件的列中包含组合索引最左边的那一列,不管该列在查询条件中的位置,都会使用索引进行查询。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 魔兽世界蓝贴:史诗安苏雷克女王调整
- 群星《涂鸦低音炮1》黑胶精选 [WAV+CUE][1G]
- 容祖儿《小小》香港首版 [WAV+CUE][1.1G]
- 费玉清《天之大》SONY台湾版 [WAV+CUE][1G]
- 英雄联盟双城之战第二季主题曲谁唱的 双城之战2主题曲演唱歌手介绍
- 逆水寒2024双11活动有什么 2024双11特惠活动开始时间
- 宝可梦大集结国服和国际服有什么区别 大集结国服vs国际服
- YelenaEckemoff-RomanceoftheMoon(2024)[24-WAV]
- 群星《发烧醉乐坊太湖美(民乐典范)》[WAV+CUE]
- 中国发烧名盘《中国管弦-九州之韵》DTS[WAV]
- V社官宣推出白色限量版Steam Deck!11月18日上市
- 梦回2016!《守望先锋2》限时推出6v6怀旧模式
- 吴京谈《镖人》拍摄过程:演员们打得很爽 文戏也过瘾
- 林家谦.2024-ISFP【FLAC分轨】
- 群星.1996-摇滚柔情【正大国际】【WAV+CUE】