当mysql查询中如果遇到order by limit时,如果orderby 字段不是一个有序的key时 会自动进行优化,即使用优先级队列(priority queue ),即使用堆排序的方式进行筛选limit n,因为这样可以避免内存的消耗,不需要对所有的结果集进行排序,只需要按照最大/最小 ,筛选出少量的数据即可。
堆排序带来的问题:
1.如果我们要排序的字段不是unique 的,那么可能每次查询得到的数据会不一致,因为堆排序意味着从结果集中随便拿出任意一条,那么相同的数据可能都会被筛选到,因此最后的limit数据会不一致。这样也会导致分页查询时,数据重复。
解决办法: order by上 加上排序索引,最好加上聚簇索引,这样就会使排序具有确定性。
分页查询,出现数据重复的可能性:
1. orderby 字段不是有序key,且重复,原因就是上面说的。
2. 在read commit模式下,第二次查询时,有新的数据插入,导致第一页的数据被挤到了第二页中。
如果不加order by 在使用limit时,mysql默认是按照聚簇索引来进行排序的,因为mysql的聚簇索引是天然的有序的,最好设置聚簇索引有序性,这也是一种约定。
6209

被折叠的 条评论
为什么被折叠?



