百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL组合索引与最左匹配准则详解
分享文章到:

MySQL组合索引与最左匹配准则详解

发布时间:05/13 来源:未知 浏览: 关键词:

前言

以前在网上看到过许多对于mysql结合索引最左前缀匹配的文章,自认为就理解了其道理,最近面试时和面试官交换,发明漏掉了些东西,这里本人整理一下这方面的内容。

什么时候创建组合索引?

当我们的where查询存在多个前提查询的时候,我们需要对查询的列创建组合索引

为何不对没一列创建索引

  • 减少开销
  • 遮盖索引
  • 效率高

减少开销:假设对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~10元,土豪随意,感谢您的阅读!

共有157人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板