说起优化排序的工作,本人菜鸟一枚,如果百度找到的我想学习请转道,因为我也不能保证一定准确。
如果发现我写的不好请留言,留下微信,我给你发红包
这块的学习领域在高性能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 查询是否使用了临时表