【mysql】联合索引-最左前缀匹配原则

最左前缀匹配原则:所使用的查询语句必须包含最左的条件,一直向右匹配直到遇到某些范围查询(>、<、>=、<=、between、like%、!=、or、is not null)、函数或表达式、(like “%value%”当前列都用不上索引,它就是全表扫描,大表不要用,其他范围查询当前列可以用到)之后的列就无法用到索引。这篇是专门测试各种范围查询语句对最左前缀的影响。

也就是我创建了索引(a,b,c,d,e,f,g),如果我的where子句中不包含a,那本次查询就用不到这个索引,如果不包含b,那b之后的列查询都用不上索引,和where子句的顺序无关。原因在我之前的文章里(https://blog.csdn.net/qiling_70/article/details/114694440

key_len计算:我用的utf-8字符集,每个字符占用三个字节,varchar字段是变长,需要+2,又允许null,需要再+1(判断是否null),因此本测试表中,a的key_len=5*3+2+1=18。d是int不受字符集影响,占4个字节,但是因为我允许了null,所以占5字节。(注意int所占字节和显示宽度11无关,同时注意区别允许null和非负数的区别)

/*创建表:建表最好不要null值,但为了测试is null、is not null,这次表允许null*/
create table test(
id int(11) PRIMARY key,
a VARCHAR(5),
b VARCHAR(8),
c VARCHAR(9),
d int(11),
e VARCHAR(13),
f VARCHAR(19),
g VARCHAR(25)
)

/*测试数据*/
INSERT into test values
(1,'a','b','c',1,'e','f','g'),(2,'1a','b2','c',2,'e','f','g'),
(3,'a','bv','c',1,'2e','f3','g'),(4,'a','b','c',4,'e','f','g3'),
(5,'a','2b','c',7,'ev','f','g'),(6,'a','3b','c',87,'ve','f','g'),
(7,'a','b','c',6,'e','f','g'),(8,'a','b','c',23,'e','f','g'),
(9,&#
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值