2 千万的 myisam 表,只对自增 id 进行分页,如何快速进行分页

2019-03-26 08:40:45 +08:00
 kisshere

目前想用 php 动态输出网站 sitemap,而网站的网址形式都如 www。example。com/[数据库自增 id].html,所以只需要对数据库 primary key 进行分页,在 offset 比较小的情况下,query 时间很短,但是当 offset 很大的情况下(每个 sitemap 总共 500 条 URL ):

SELECT id FROM MyTable ORDER BY id ASC LIMIT 19990000,500

查询时间很长,像这种只涉及到自增 id 的大表分页,怎样快速进行分页?

2100 次点击
所在节点    程序员
10 条回复
vicalloy
2019-03-26 08:57:49 +08:00
太老的页面直接不给查。
分表。
lostvincent
2019-03-26 09:08:41 +08:00
关键词:late row lookup
jswh
2019-03-26 09:12:46 +08:00
offset 大的时候用 id > x 会比 limit 好一点
keepeye
2019-03-26 09:15:43 +08:00
select * from YOURTABLE where id > (select id from YOURTABLE limit OFFSET,SIZE)
sagaxu
2019-03-26 09:17:44 +08:00
https://explainextended.com/2011/02/11/late-row-lookups-innodb/

只有 myisam 才有这个问题,pgsql 或者 innodb 没有这个坑
kisshere
2019-03-26 09:27:20 +08:00
@jswh 生成 sitemap 只能这种分页吧,不能游标分页
haiyang416
2019-03-26 09:35:02 +08:00
不要用 offset 来做了,把每次查询的最后一个 ID 作为分页依据。
snappyone
2019-03-26 09:45:20 +08:00
参考 4 楼子查询
opengps
2019-03-26 11:16:05 +08:00
这个情况,表分区特别合适
dongyu
2019-03-26 17:52:57 +08:00
用索引过滤

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

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

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

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

© 2021 V2EX