在上篇文章我们学习了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 -