博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL组合索引和最左匹配原则
阅读量:5938 次
发布时间:2019-06-19

本文共 2033 字,大约阅读时间需要 6 分钟。

什么时候创建组合索引?

当我们的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进行查询

总结

如上测试,可以看到只要查询条件的列中包含组合索引最左边的那一列,不管该列在查询条件中的位置,都会使用索引进行查询。

欢迎各路英雄好汉指正文中的错误!

转载于:https://juejin.im/post/5c862b3ff265da2dda698456

你可能感兴趣的文章
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
apache prefork模式优化错误
查看>>
jmeter高级用法例子,如何扩展自定义函数
查看>>