千家信息网

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

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,前言之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。什么时候创建组合索引?当我们的where
千家信息网最后更新 2025年11月07日MySQL组合索引与最左匹配原则详解

前言

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

总结

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

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

索引 查询 组合 数据 条件 测试 内容 效率 选出 如上 就是 开销 时候 学习 排序 原则 不对 最高 东西 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何打开master数据库 永兴安卓软件开发多少钱一个月 基于网络安全的流量分析技术 网络安全方面的专题 沧州管理系统软件开发 银行使用的数据库 学校校校园网络安全应急预案 酒店开发票系统怎么检查服务器 外交部 国外网络技术不行 网站关联数据库 网络安全周手抄报 四年级 鄢陵百视通网络技术服务有限公司 公司网络安全风险管理由谁制定 浙江网络营销软件开发定制优势 梦幻诛仙最新服务器 网络技术vlog 网络技术和计算机通信区别 什么配置的服务器能装win10 服务器的配制与管理 河南互联网软件开发诚信服务 数据库表什么时候建立索引 软件开发可以转行其他专业吗 计算机网络技术之类的 电脑免费服务器节点 自研数据库服务 小米开不了机里面的数据库 vncviewer连接服务器 浙江web前端软件开发要多少钱 建立数据库视图的sql语句 数据库隐式转换实例详解
0