mysql 中如何增加查询排序性能

说起优化排序的工作,本人菜鸟一枚,如果百度找到的我想学习请转道,因为我也不能保证一定准确。

如果发现我写的不好请留言,留下微信,我给你发红包

 

这块的学习领域在高性能mysql中175页使用索引排序,查询官方的总比我写的好一些

 

前言:在索引中,每种索引的存储方式都是不同在,在innodb中,存储方式可以概括为

存储事务id ,回滚事务id,主键索引,还有其他列的索引

因为有其他列的索引存在的关系,加入查询的条件在索引的范围以内,它就可以不用回表进行查询,

先提提回表的消耗,它会产生随机的磁盘io,相对于全表查询来说他的性能会更差,但是加入产生了索引情况

为查询字段全部包含的,他就会产生覆盖索引,在索引中结束了查询,尤其是myisam中,bree tree 索引可以进行

压缩的情况,他会让查询的速度更快,然后where条件和查询字段还有order条件中每个阶段的索引都是非常重要的

 

order by 中的字段顺序其实也是很重要的,但是可能

mysql中如果使用排序即 order by 可能会存在使用using temproary  或者filesort 的情况,将会影响到查询性能,

现在有一些特殊的情况会使得排序查询不使用filesort

首先order by中涉及的字段需要从最左相对索引,进行挨个判断,不能存在索引之外字段进行排序,

然后符合排序(默认是升序)的如果需要使用降序,有一种设计方案,将字符串翻转,或者取反,加入使用的是多表查询,

orderby 中只能包含关联的第一张表,使用到的索引中的从左侧开始的字段,

也有例外 ,当使用了左侧的数据使用了常量,数据也可以使用下一个字段

打字太累了,搬动这个吧

 

 

 以上的理论

这个是我自己进行模拟测试的情况

例如

目前存在索引

 

 

 

 

   因为需求的原因,有许多项目出现要优化倒序的排序

   可以在创建索引的时候进行desc 例如

ALTER TABLE `wd_announcement`
ADD INDEX `aa` (`role_id` desc) ;

  然后进行explain 查询是否使用了临时表

 

posted @ 2017-12-05 14:28  to_simple  阅读(2989)  评论(0编辑  收藏  举报