MySQL联合索引(abc)命中测试

1.建表

mysql创建一张表,表名:'test_models'

  • id列为 主键,int类型 ,自增
  • a,b,c,d,e 全部是int(11)
  • 为(a,b,c)添加一个联合索引 index_abc

执行语句:创建表

复制代码
CREATE TABLE `test_models` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
 `a` INT(11) DEFAULT NULL,
 `b` INT(11) DEFAULT NULL,
 `c` INT(11) DEFAULT NULL,
 `d` INT(11) DEFAULT NULL,
 `e` INT(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `index_abc` (`a`,`b`,`c`)
);

创建测试数据:

复制代码
DELIMITER //

CREATE PROCEDURE insert_random_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 1000000 DO
        INSERT INTO test_models (a, b, c, d, e)
        VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 10000), FLOOR(RAND() * 100000), FLOOR(RAND() * 1000), FLOOR(RAND() * 1000));
        SET i = i + 1;
    END WHILE;
END //

DELIMITER ;

-- 调用存储过程
CALL insert_random_data();

执行该存储过程后,会生成 100 万条随机数据。这种方法适合 MySQL 存储过程,并且只需运行一次命令。

二.测试数据

通过,走联合索引(a,b,c)成功

复制代码
EXPLAIN SELECT * FROM test_models WHERE a = 100 AND b = 1000 AND c = 10000;

三.具体测试示例

1.当我们通过where来表示的时候,只要是a开头的时候,都会走最左索引的原则来进行

2.当我们以b或c开头的时候,由于违背了最左的原则,导致无法走abc的索引

3.特殊情况分析,查询语句where a和c的时候

=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序

mysql的查询优化器会帮你优化成索引可以识别的形式

四.总结

4.1 MySQL联合索引遵循最左前缀匹配规则,即从联合索引的最左列开始向右匹配,直到遇到匹配终止条件。

例如联合索引(col1, col2, col3), where条件为col1=a AND col2=b可命中该联合索引的(col1,col2)前缀部分, where条件为col2=b AND col3=c不符合最左前缀匹配,不能命中该联合索引。

4.2 匹配终止条件为范围操作符(如>, <, between, like等)或函数等不能应用索引的情况。

例如联合索引(col1, col2, col3), where条件为col1=a AND col2>1 AND col3=c, 在col2列上为范围查询,匹配即终止,只会匹配到(col1, col2),不能匹配到(col1, col2, col3).

相关推荐
城管不管2 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
倔强的石头1062 小时前
向量数据库从相似度检索走向融合数据底座
数据库
今天AI了吗4 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
夜雪一千5 小时前
MySQL 全局锁是什么?原理、风险、备份踩坑完整实战
android·mysql·adb
lilian2335 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
皮卡丘不断更5 小时前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
保卫大狮兄6 小时前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备
数据安全技术观察6 小时前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
小席是个热心肠7 小时前
Redis的自我学习
数据库·redis·学习
2601_965798477 小时前
Salient Theme Setup Guide for Fast Creative WordPress Sites
数据库·web3·php·wordpress