排序(order by)
在mysql中,生成有序数据有两种方式,一种是对结果进行排序,还有一种是对索引进行顺序扫描.如果使用explain
关键字分析时,type
字段若为index
则表明其使用了索引扫描来做了排序.
尽管mysql中索引扫描速度很快,只需要在叶子节点中不断访问下一个叶子节点即可,但是如果存在待查询的字段不都在索引中时,这个时候需要不断的回表查询,这相当于进行了若干次随机的I/O操作,其性能要比顺序全表扫描更慢.
因此在设计索引时,尽量使其同时满足查询项和排序项都在索引中.
但是在mysql中即使是对索引进行排序,也需要满足以下规则也才能使用到索引:
- 索引中的列顺序同order by中的列顺序完全一致,并且排序方向都要一致(要么都是
asc
,要么都是desc
)
- 索引中的列顺序同order by中的列顺序完全一致,并且排序方向都要一致(要么都是
- 如果查询是关联了多张表,那只有当排序条件都来自同一张表时才能使用索引排序
- order by中的排序也要满足最左前缀原则,但是有一种情况除外,当前导列为一个常量时则也能使用索引扫描.例如某个索引是
key(A,B,C)
,在查询... where B=1 order by A desc, B desc
,还有对于... where A>1 order by B desc , C desc
也是能用索引扫描的.
- order by中的排序也要满足最左前缀原则,但是有一种情况除外,当前导列为一个常量时则也能使用索引扫描.例如某个索引是
压缩索引
MyISAM 可以使用前缀压缩来减少索引的大小,在某些情况下能极大的提高性能.但其默认只压缩字符串,不过也可以调整参数来使其对整数的压缩.
其压缩方法是,先完全保存索引的第一个值,然后将后面的值与第一个进行比较,将不同的部分存储起来.
例如,索引值(perform, performance),压缩后的结果为(perform, (7,ance))
索引压缩虽然减少了索引的空间占用,但是其代价是查询数据会变慢,特别是反向查询的时候
网友评论