MySQL进阶——索引使用规则

在上篇文章我们学习了MySQL进阶——索引,这篇文章学习MySQL进阶——索引使用规则。

索引使用规则

在使用索引时,需要遵守一些使用规则,否则索引会部分失效或全部失效。

最左前缀法则

最左前缀法则是查询从索引的最左列开始,并且不跳过索引中的列。

当一个索引关联了多个字段(联合索引)时,要遵守最左前缀法则,如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

例如我们现在有如下联合索引,

上面的联合索引Phone字段的Seq_in_index为1,则编写查询条件时,Phone条件必须存在。

按照Seq_in_index的顺序来编写查询条件:

可以发现成功使用了联合索引,且每少一个条件字段,所用到的索引长度也会减少。

当Seq_in_index为1的索引字段没有在查询条件时,索引将失效,也就是查询语句不使用索引,如下图所示:

当缺少Seq_in_index非1的索引字段时,部分索引失效,如下图所示:

范围查询

联合索引中,假如出现了范围查询(>,<)时,范围查询右侧的索引字段失效,如下图所示:

索引字段不能运算

不能对索引字段进行运算,否则索引失效,如下图所示:

字符串不加引号

在索引字段的类型为字符类型时,查询条件不加引号时,索引也会失效,如下图所示:

模糊查询

如果仅仅是尾部模糊匹配时,索引不会失效,如果是头部模糊匹配时,索引失效。

or连接的条件

用or分割的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引不会被用到。

MySQL评估

如果MySQL评估觉得使用索引比全表更慢,则不使用索引。

例如:这里的手机号都是1开头的,查询手机号大于等于10000000000、手机号大于等于20000000000的SQL语句使用索引情况完全不同,如下图所示:

指定索引

当查询条件的字段既有联合索引,又有单列索引时,MySQL会自动选择使用一个索引,如下图所示:

可以看到可能用的索引有两个,实际只用了一个索引。

这时我们可以通过SQL提示,通过use、ignore、force指定SQL语句使用、忽略和必须使用哪个索引,其用法如下:

select * from 表名 use index(索引名) where 字段条件;   # 使用索引,MySQL可能会忽略,使用其他索引
select * from 表名 ignore index(索引名) where 字段条件;  # 忽略索引,不使用该索引
select * from 表名 force index(索引名) where 字段条件;       # 强制使用索引

示例如下图所示:

覆盖索引

在SQL查询语句中尽量返回设置了索引的字段,减少select * 的使用,例如:索引相关的字段有ID、Phone、Email、Age中,那么返回的字段尽量只返回ID、Phone、Email、Age,如下图所示:

当我们返回了一个和索引无关的字段,不会有额外的信息,如下图所示:

一般有额外信息的查询效率更好。

好了,MySQL进阶——索引使用规则就学到这里了。

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、Django、自动化测试、Git、算法、前端、服务器等相关文章!

- END -

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白巧克力LIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值