V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kisshere
V2EX  ›  程序员

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

  •  
  •   kisshere · 2019-03-26 08:40:45 +08:00 · 2209 次点击
    这是一个创建于 2075 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前想用 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 的大表分页,怎样快速进行分页?

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

    只有 myisam 才有这个问题,pgsql 或者 innodb 没有这个坑
    kisshere
        6
    kisshere  
    OP
       2019-03-26 09:27:20 +08:00
    @jswh 生成 sitemap 只能这种分页吧,不能游标分页
    haiyang416
        7
    haiyang416  
       2019-03-26 09:35:02 +08:00
    不要用 offset 来做了,把每次查询的最后一个 ID 作为分页依据。
    snappyone
        8
    snappyone  
       2019-03-26 09:45:20 +08:00
    参考 4 楼子查询
    opengps
        9
    opengps  
       2019-03-26 11:16:05 +08:00
    这个情况,表分区特别合适
    dongyu
        10
    dongyu  
       2019-03-26 17:52:57 +08:00
    用索引过滤
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2143 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:40 · PVG 08:40 · LAX 16:40 · JFK 19:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.