前言
Mysql 慢查询优化,一直是开发中不可避免的问题,当然面试的时候也是。
今天的面试中,面试的最后一道题:“如何提供分页查询”,我自信的写下 LIMIT
,认为此题十拿九稳,面试官此后的问题为当 offset
到一定数量的时候怎么优化,因为之前没有遇到过类似的问题,而且也没有量特别大的分页,所以这个问题只能作罢。
复盘
回家后弄了个大概有快 20W 数据的表,实测一下,查询速度是否会因为 limit
边大而边长。
如上图所示,同样的查询条件下,因为 limit
增大查询速度确实变慢了很多。
why?
对于 limit 子句 LIMIT [offset,] row_count
,官网说明如下
- The
offset
specifies the offset of the first row to return. Theoffset
of the first row is 0, not 1. - The
row_count
specifies the maximum number of rows to return. - 翻译一下就是:
offset
参数指定要返回的第一行的偏移量。第一行的偏移量为0
,而不是1
。count
指定要返回的最大行数。
因为要偏移到 offset
处,所以就要先扫描前 offset
行,所以随着 limit
边大,也就越来越慢。
解决
随意 Google 一下,就找到了两种解决办法,分别贴出对于 SQL 以作参考
因为数据量小,然后数据没有特意去设计,所以整体来说效果一般,但是还是有所提升
思考
针对 limit 的优化,更多的应该是让 limit 去尽量少的偏移数据,具体步骤如下:
- 使用索引列或者主键作为
order by
操作列 - 记录上次查询的主键,作为下次查询时主键的筛选条件
参考:性能优化之分页查询
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于