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).

相关推荐
0xDevNull4 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存