limit mysql 取最后_分页场景(limit,offset)特别慢,有什么办法可以优化?

2021-06-07 14:19:21 +08:00
 aries910

目前的场景就是 单表大概 20 万左右的数据,需要分页,排序(浏览量、新增时间,点赞等等) laravel 生成的 sql select id, logo, title, supports, collections, created_at, views, user_id, summary from table where status > 0 order by supports desc, created_at desc limit 20 offset 164920;

因为 offset 就执行的很慢 求大牛给点解决方案加速下,最好就是通过修改 sql 的方式

PS:机器是单核小主机。。。

3007 次点击
所在节点    问与答
39 条回复
loophole12
2021-06-07 14:24:34 +08:00
可以先把拉取的 id 都取出来,再根据 id 用 in 拉取整行数据
sheeta
2021-06-07 14:39:24 +08:00
取上次分页最后的结果 id, > id limit 20 。缺点,不能跳到指定的页。
ksedz
2021-06-07 14:48:01 +08:00
加索引试试
2kCS5c0b0ITXE5k2
2021-06-07 14:48:53 +08:00
Select * From table_name Where id in (Select id From table_name where status > 0) order by supports desc, created_at desc limit 20 offset 164920;
2kCS5c0b0ITXE5k2
2021-06-07 14:49:27 +08:00
不过 20 万就干趴下 看看慢日志
aries910
2021-06-07 15:01:21 +08:00
@emeab 上面的 sql 就是从慢日志里找出来的啊。。。
还有你上面的 sql 一样慢,没用
aries910
2021-06-07 15:02:06 +08:00
@sheeta 感谢提供思路,但是指定页的功能还是需要的
aries910
2021-06-07 15:02:18 +08:00
@loophole12 试过了,没啥用
aries910
2021-06-07 15:05:15 +08:00
@ksedz 上面的 status 和 supports 都加了单独的索引,没啥用给,我看网上有人说 mysql 查询的时候,where 和 order 只会用一个索引,所以就算都有索引也没用,我去尝试了也确实没用(我不太考虑复合索引,毕竟小机器,怕后面数据更大了更新索引占资源)
2kCS5c0b0ITXE5k2
2021-06-07 15:15:00 +08:00
@aries910 SELECT * FROM table INNER JOIN( SELECT id FROM table status > 0 order by supports desc, created_at desc LIMIT 10000,100 ) b USING(id) 试下? 我这边单表快 40 万, 也就 0.1 秒
Jooooooooo
2021-06-07 15:29:20 +08:00
大数分页是无解问题

一个妥协的方案是用 id 当游标
dqzcwxb
2021-06-07 15:33:54 +08:00
@sheeta #2 正解
aries910
2021-06-07 15:48:14 +08:00
@emeab 感谢再次回复,这边不能上传图片,我这边执行了还是十几秒
2kCS5c0b0ITXE5k2
2021-06-07 15:52:20 +08:00
@aries910 我这边二次执行就快了.
2kCS5c0b0ITXE5k2
2021-06-07 15:52:45 +08:00
SELECT *
FROM table AS t1
JOIN (SELECT id FROM table ORDER BY id desc LIMIT 500000, 1) AS t2WHERE t1.id = t2.id ORDER BY t1.id desc LIMIT 2;
2kCS5c0b0ITXE5k2
2021-06-07 15:53:18 +08:00
这个也行. 因为没完整的表 只能这样了.
aries910
2021-06-07 16:05:05 +08:00
@emeab
没用,只能借用新浪的图床了
cnoder
2021-06-07 16:29:01 +08:00
楼上方法叫 延迟关联
notejava
2021-06-07 16:35:06 +08:00
思路拓宽一点,从查询流程上优化,例如提前然用户填筛选条件筛选掉部分数据,再做分页。
2kCS5c0b0ITXE5k2
2021-06-07 16:47:42 +08:00
@aries910 explain 看下索引

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781896

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX