limit 1000,10和limit 10速度一样快嘛?
以下是在本地执行结果
select * from event_log limit 10
10 rows retrieved starting from 1 in 133 ms (execution: 83 ms, fetching: 50 ms)
select * from event_log limit 1000, 10
10 rows retrieved starting from 1 in 113 ms (execution: 86 ms, fetching: 27 ms)
select * from event_log limit 10000, 10
10 rows retrieved starting from 1 in 141 ms (execution: 119 ms, fetching: 22 ms)
很显然三者的速度并不一致,但是limit 10和limit 1000,10相差无几,limit 10000, 10则相对来说慢上一些
但另一方面也说明,在数量级没有达到一定程度时,没有必要优化
对普通字段加索引
加索引无论在数据量大还是数据量小的时候都很适用。
SELECT * FROM t ORDER BY name LIMIT 100, 10;
子查询获取主键
在偏移量较大时,Mysql会扫描偏移量之前的所有行,那这样的随机IO很多,因此分页查询越往后越慢
于是我们可以通过子查询先查到id,然后从id开始获取数据
SELECT * FROM (SELECT id FROM t WHERE name = "x" ORDER BY rid LIMIT 10000, 10) temp LEFT JOIN t ON temp.id = t.id
rethink 为什么需要分页
如果我们只是想取出所有数据,但是数据量太大没办法一次取到所有数据。那么也许可以根据id排序,然后将当前批次的最大id作为下一次筛选的条件
sid:=0
for {
data:= select * from t where id > sid order by id limit 10
if len(data) == 0{
break
}
sid = getMaxId(data)
}
如果是给用户做分页展示的话,那么可以更进一步思考我们要提供给用户什么样的分页。
如果更想给用户无阻断的游览体验的话,就像抖音那样,那样分页的规律便是固定从前到后;
如果更想让用户跳转,但又限制用户只能随意跳前几页,比如像谷歌那样信息检索,那么也许一次查询多页是更好的;
最后我们应该思考,什么情况下用户需要无限制的随意跳转呢?页码提供的信息是极为有限的,最多只知道我们想要看中间或者想要看最后的这种大致位置的,那么这个时候也许可以提供跳转最后的按钮给用户,至于中间的,搜索可能会是更优选择。
Ref
- https://blog.csdn.net/zgdwxp/article/details/102231838
- https://mp.weixin.qq.com/s/F_c36mAkWxGyQrhkviC46Q
|