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

作者:Wolf、Heart 时间:2024-01-24 18:28:16 

前言

之前在网上看到过很多关于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进行查询

总结

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

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

来源:https://juejin.im/post/5c862b3ff265da2dda698456

标签:mysql,索引,最左匹配
0
投稿

猜你喜欢

  • html+css+js实现别踩白板小游戏

    2023-09-02 10:05:42
  • 详解Python中的变量及其命名和打印

    2023-07-23 11:31:45
  • python数据结构之搜索讲解

    2022-12-31 08:09:02
  • go实现一个分布式限流器的方法步骤

    2024-04-28 10:46:36
  • Python初学者必须掌握的25个内置函数详解

    2022-07-02 16:09:21
  • [欣赏] 情景互动广告

    2008-08-06 12:59:00
  • Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法

    2021-01-16 18:41:38
  • Python实现连接dr校园网示例详解

    2022-09-20 05:00:45
  • Python+matplotlib实现华丽的文本框演示代码

    2021-07-19 08:19:51
  • Python 'takes exactly 1 argument (2 given)' Python error

    2022-04-19 00:26:05
  • css:小技巧大问题,cellSpacing用css样式代替方法,其它样式类似解决!

    2009-10-04 20:35:00
  • 提升MySQL查询效率及查询速度优化的四个方法详析

    2024-01-14 21:05:11
  • python中 * 的用法详解

    2023-06-22 20:05:43
  • iframe全跨域高度自适应解决方案

    2008-12-21 16:16:00
  • Python使用面向对象方式创建线程实现12306售票系统

    2021-01-22 09:13:36
  • SQL Server 2005数据库批量更新解决办法

    2009-04-11 16:12:00
  • Python实现采集网站ip代理并检测是否可用

    2021-01-10 09:10:53
  • 记一次成功的sql注入入侵检测附带sql性能优化

    2011-09-30 11:29:39
  • ElementUI嵌套页面及关联增删查改实现示例

    2023-07-02 16:54:45
  • 2022最新腾讯轻量云 debian 10 安装pve教程详解

    2022-09-16 15:55:38
  • asp之家 网络编程 m.aspxhome.com