实用性极强的MySQL查询优化策略( 三 )


1.使用age字段进行排序
由于age字段未加索引,查询结果按照age排序的时候发现使用了filesort , 排序性能较低 。

实用性极强的MySQL查询优化策略

文章插图
给age字段添加索引,再次使用order by时就走了索引 。
实用性极强的MySQL查询优化策略

文章插图
2.使用多字段进行排序
通常在实际业务中,参与排序的字段往往不只一个 , 这时候,就可以对参与排序的多个字段创建联合索引 。
如下根据stuno和age排序:
实用性极强的MySQL查询优化策略

文章插图
给stuno和age添加联合索引:
create index idx_stuno_age on `student`(stuno,age);
再次分析时结果如下,此时排序走了索引:
实用性极强的MySQL查询优化策略

文章插图
1)关于多字段排序时的注意事项
  • 排序时,需要满足最左前缀法则,否则也会出现 filesort
在上面我们创建的联合索引顺序是stuno和age,即stuno在前面,而age在后 , 如果查询的时候调换排序顺序会怎样呢?通过分析结果发现,走了filesort 。
实用性极强的MySQL查询优化策略

文章插图
  • 排序时,排序的类型保持一致
在保持字段排序顺序不变时,默认情况下,如果都按照升序或者降序时,order by可以使用index,如果一个是升序 , 另一个是降序会如何呢?分析发现 , 这种情况下也会走filesort 。
六、分组(group by)优化
group by 的优化策略和order by 的优化策略非常像,主要列举如下几个要点:
  • group by 即使没有过滤条件用到索引 , 也可以直接使用索引;
  • group by 先排序再分组,遵照索引建的最佳左前缀法则;
  • 当无法使用索引列时,增大 max_length_for_sort_data 和 sort_buffer_size 参数的设置;
  • where效率高于having,能写在where限定的条件就不要写在having中了;
  • 减少使用order by,能不排序就不排序,或将排序放到程序去做 。Order by、groupby、distinct这些语句较为耗费CPU,数据库的CPU资源是极其宝贵的;
  • 如果sql包含了order by、group by、distinct这些查询的语句 , where条件过滤出来的结果集请保持在1000行以内,否则SQL会很慢;
1.给group by的字段添加索引
如果字段未加索引,分析结果如下,这种结果性能显然很低效 。
实用性极强的MySQL查询优化策略

文章插图
给stuno添加索引之后:
实用性极强的MySQL查询优化策略

文章插图
给stuno和age添加联合索引:
实用性极强的MySQL查询优化策略

文章插图
如果不遵循最佳左前缀,group by 性能将会比较低效 。
实用性极强的MySQL查询优化策略

文章插图
遵循最佳左前缀的情况如下:
实用性极强的MySQL查询优化策略

文章插图
七、count 优化
count() 是一个聚合函数,对于返回的结果集 , 一行行判断,如果 count 函数的参数不是NULL,累计值就加 1 , 否则不加,最后返回累计值 。
用法:count(*)、count(主键)、count(字段)、count(数字)
如下列举了count的几种写法的详细说明:
实用性极强的MySQL查询优化策略

文章插图
经验值总结:
按照效率排序来看,count(字段) < count(主键 id) < count(1) ≈ count(*),所以尽量使用 count(*)
作者丨逆风飞翔的小叔
来源丨blog.csdn.NET/congge_study/article/details/127712927

【实用性极强的MySQL查询优化策略】


推荐阅读