mysql联合索引的最左匹配原则实验及验证

3 篇文章 0 订阅
3 篇文章 0 订阅
  • 表结构
/*
MySQL - 5.5.62 
*********************************************************************
*/

create table `student` (
	`id` int (10),
	`user_name` varchar (30),
	`age` int (10),
	`score` int (10),
	`item` varchar (30)
); 
insert into `student` (`id`, `user_name`, `age`, `score`, `item`) values('1','lx','18','100','数学');
insert into `student` (`id`, `user_name`, `age`, `score`, `item`) values('2','gj','19','90','英语');
insert into `student` (`id`, `user_name`, `age`, `score`, `item`) values('3','gj','19','80','数学');
insert into `student` (`id`, `user_name`, `age`, `score`, `item`) values('4','lx','18','90','英语');
  • 创建索引:
/*
创建联合索引,user_name,age,score
*/
CREATE INDEX index_userName_age_score ON student(`user_name`,`age`,`score`);
  • 查询表的索引:
/*
查询表的索引
*/
SHOW INDEX FROM student

分析语句是否能用到索引,使用explain语句来分析sql语句是否能用到索引。

能用到执行结果的key列为创建时命名的key,如下图

不能用到的结果,key为null,如下图:

  • 执行以下语句即可直观的看到最左匹配的规则:
/*
根据索引条件查询顺序的最基本查询,可以用到索引
*/
EXPLAIN SELECT * FROM student WHERE user_name = "lx" AND age = 18 AND score = 100

/*
不符合最左匹配的情况,不能用到该联合索引。
*/

EXPLAIN SELECT * FROM student WHERE age = 18

EXPLAIN SELECT * FROM student WHERE score = 100

EXPLAIN SELECT * FROM student WHERE age = 18 AND score = 100

/*
符合最左匹配的情况,以下查询都可以用到索引。
*/

EXPLAIN SELECT * FROM student WHERE user_name = "lx" 

EXPLAIN SELECT * FROM student WHERE user_name = "lx" AND age = 18

EXPLAIN SELECT * FROM student WHERE user_name = "lx" AND score = 100

EXPLAIN SELECT * FROM student WHERE user_name = "lx" AND score = 100 AND age = 18

 

 

 

总结:

联合索引,只要最左边的条件存在,后面的索引条件不限制顺序,即就可以用到索引,不存在就用不到该联合索引。

索引很重要,当数据量大的时候,查询所消耗的时间相差很大,没有索引是有索引的几百倍耗时。根据开发情况,能加的必须加。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值