暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

LIMIT 100000,10会发生什么?

小源学源码 2019-11-02
939

LIMIT分页优化

进行分页操作时,通常都会通过偏移量来查询某些数据。然后再加上合适的order by子句, order by的列加上了索引,性能一般都不错,而如果没有对应的索引的话,MySQL则需要做大量的文件排序操作,对于文件排序操作,下面有说明。

Limit 100000,10 会发生什么?

Limit的语法是limit m,n 其中m是偏移量,n代表返回的数据条数。比如limit 0,3 就从第一条数据开始读取后面三个数据(1,2,3 ),limit 2,3就从第三条数据开始读取后面三个数据(3,4,5),但是不要以为limit这样操作会直接定位到第三条数据,还是会扫描前两条数据。回到我们要回答的问题,由于100000这个数字非常大, 查询这么多条数据代价非常高,对于这种情况,有两种办法,一种就是页面中限制分页的数量,另外是优化大偏移量的性能。优化大偏移量的性能最简单的方法是使用索引覆盖扫描,还有的方法就是使用延迟关联,它会让MySQL扫描尽可能少的页面,获取需要访问的记录后再根据关联列回表查询需要的所有列。如下

//先快速定位需要获取的id段,然后再关联:
select a.* from table a
(select id from table where 条件 limit 10000000,20) b where a.id=b.id

MySQL中的排序优化

在MySQL中的ORDER BY有两种排序方式:第一种是利用有序索引获取有序数据,第二种是用文件排序。文件排序是一个成本很高的操作,应该尽量避免。当数据量比较小时,文件排序会在内存中进行,否则在磁盘上进行。文件排序有两种排序算法:两次传输排序和单次传输排序。两次传输算法是旧版本使用的一种算法,原理是读取行指针和需要排序的字段,对其进行排序,然后根据排序结果读取所需要的数据行。这样操作会进行两次数据传输,第二次读取的时候会产生大量的随机I/O,成本极高。单次传输算法是新版本中的,原理是先读取查询所需要的所有列,然后再根据给定的列进行排序,最后返回结果。不再需要从数据表读取两次数据,只需要一次顺序I/O读取所有的数据,无须任何的随机的I/O。缺点是如果需要返回的列非常的多,会额外占用大量的空间。两种算法都有各自的适用场景,没有那种算法更为高效的说法。在MySQL中有一个参数max_length_for_sort_data可以用来决定适用那种排序算法,当查询所有列的总长度不超过这个参数时,MySQL适用单次传输排序算法,否则MySQL会选择两次传输排序算法。


文章转载自小源学源码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论