Py学习  »  DATABASE

MySQL基础(十):索引优化

凤求凰的博客 • 3 年前 • 349 次点击  

下面是小凰凰的简介,看下吧!
💗人生态度:珍惜时间,渴望学习,热爱音乐,把握命运,享受生活
💗学习技能:网络 -> 云计算运维 -> python全栈( 当前正在学习中)
💗您的点赞、收藏、关注是对博主创作的最大鼓励,在此谢过!
有相关技能问题可以写在下方评论区,我们一起学习,一起进步。
后期会不断更新python全栈学习笔记,秉着质量博文为原则,写好每一篇博文。

一、针对索引失效的十点优化

1、全值匹配我最爱

释义: 索引 idx_staffs_nameAgePos 建立索引时 以 name , age ,pos 的顺序建立的。 全值匹配表示按顺序匹配的

实例:
在这里插入图片描述

2、最佳左前缀法则

释义: 如果索引了多列,要遵守最左前缀法则。指的是查询 从索引的最左前列开始并且不跳过索引中的列。
实例 (下面实例索引为NAME_age_pos):
在这里插入图片描述 第一句口诀: 带头大哥不能死,也就是说查询必须要有name,才能使用索引
在这里插入图片描述 第二句口诀: 中间兄弟不能断,即是age字段没用到 ,key不为NULL,说明用到了索引,key_len相比于上一个图没变,因此说明只是Name用到了索引!

3、不在索引列上做任何操作

例如: 计算、函数、(自动or手动)类型转换,会导致索引失效而转向全表扫描
实例:
在这里插入图片描述

4、存储引擎不能使用索引中范围条件右边的列

释义: 范围 若有索引则能使用到索引,范围条件右边的索引会失效(范围条件右边与范围条件使用的同一个组合索引,右边的才会失效。若是不同索引则不会失效)
实例:
在这里插入图片描述 最后一个查询语句, age>11,这是范围,后面的pos便会失效 !因此key_len不是140,而是78! 只有name、age索引有效!

5、尽量使用覆盖索引

释义: 只访问索引的查询(索引列和查询列一致),减少select *
实例:
在这里插入图片描述 第三个key_len为74,还是只有name、age用到了索引,范围之后依旧失效了!覆盖索引也无法拯救它!

6、mysql避免使用(!= 、<>)

释义: mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
实例:
在这里插入图片描述

7、is not null 也无法使用索引,但是is null是可以使用索引的

实例:
在这里插入图片描述

8、避免使用like的%开头的匹配

释义: like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作
实例:

like%abc%type 类型会变成 all
like%abc’  type 类型会变成 all
like ‘abc%type 类型为 range ,算是范围,可以使用索引
  • 1
  • 2
  • 3

在这里插入图片描述
问题:解决like '%字符串%'时索引不被使用的方法?
在这里插入图片描述 在这里插入图片描述 采用覆盖索引的方法,可以解决like '%字符串%'时索引不被使用的问题
在这里插入图片描述
id是主键,因此它也是覆盖索引!

9、字符串不加单引号索引失效

释义: 底层进行转换使索引失效,使用了函数讲整数转换成字符串,造成索引失效
实例:
在这里插入图片描述

10、少用or,用它来连接时会索引失效

实例:
在这里插入图片描述

11、实战演练

在这里插入图片描述

二、优化器对sql语句的自我优化分析

1、自我优化

在这里插入图片描述
我们 建立的索引是1234,但是我们查询的时候,是4321,这些都会自动优化成1234 ,应该尽量避免其优化,因为优化也是需要开销的!

2、自我优化+范围

在这里插入图片描述

四个索引全部用到了,因为自我优化分析之后, 范围就是最后一个了!因此没有失效的!

3、自我优化+排序

在这里插入图片描述 索引用于查询和排序, 其中貌似只有两个索引有效,其实是三个,只是c3索引在排序,而不是查询 ,因此没有显示,在查询层面,在c3这一处断层了,因此c4索引查询失效! 和下面这个语句效果一样:
在这里插入图片描述 这时候需要和filesort场景区别开了 ,看下面:
在这里插入图片描述 按到c4排序,c4再也不能因为索引失效而沉默了,因为我要的结果就是c4排序,因此mysql只能自力更生using filesort!

4、自我优化+order排序的有序性问题

在这里插入图片描述 自我优化的前提是几个元素之间位置变动,结果不受影响!比如说and连接的。但是order by c2,c3这个c2和c3位置是不能随便乱变的,改变了,结果就会变!

建立索引是1234,然而查询c1索引有效,排序却是3,2因此索引无法再使用,因此只能使用文件内排序达到目的!c5索引查询失效!

5、自我优化+order排序有序性问题的特例

在这里插入图片描述 为什么order by c3,c2没有filesort?因为c2是常量,不需要排序,因此就相当于order by c3

6、自我优化+group by分组问题

在这里插入图片描述 分组之前必排序 ,因此只用到了一个索引,c2,c3索引是用来排序的,c4失效!
在这里插入图片描述 分组会排序,因此出现文件内排序,但分组多了个having分组,因此还会出现临时表! group by基本和order by优化基本一致

三、使用索引的一般性建议

1. 对于单键索引,尽量选择针对当前query过滤性更好的索引
2. 在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。(避免索引过滤性好的索引失效)
3. 在选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引
4. 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的
  • 1
  • 2
  • 3
  • 4
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70856
 
349 次点击