【问题标题】:MySQL large table performance issues when paging with PHP使用 PHP 分页时的 MySQL 大表性能问题
【发布时间】:2023-04-03 13:27:08
【问题描述】:

有一个包含大约 300,000 条记录的巨大 mysql 表,并希望以这种方式通过查询在 PHP 中对记录进行分页(但这里不是重点):

SELECT * FROM `table` LIMIT 250000, 100 

在记录的后半部分可能会很慢,尤其是在接近表末尾时(LIMIT 开始非常大)。我的猜测是 MySQL 必须一直精确到 250000 才能将结果提供给我?

那么如何解决这个问题或任何其他可能更快的分页方法?谢谢!

【问题讨论】:

    标签: mysql database performance


    【解决方案1】:

    确保您使用的是索引,否则它会执行全表扫描。您可以查看执行计划来验证这一点,或者使用ORDER BY 子句(在索引列上)强制问题。这里是more information

    您的表不是那么大,只有 300k 行。然而,接近表格末尾存在性能问题。唯一真正的解决方案是伪造限制条款。有一个自动递增字段,将行编号从 1 到 300,000,然后执行:

    SELECT *
    FROM mytable
    WHERE field BETWEEN 250000 and 250100
    

    或类似的。如果您经常删除行,这可能会出现问题或不可能,但我倾向于发现旧数据往往变化较少,因此您可以通过对前 100,000 行使用 LIMIT 和除此之外的代理分页列来稍微优化它。

    【讨论】:

      【解决方案2】:

      你是对的:MySQL 必须先扫描 250000 行无用的行,然后才能读取你想要的行。除了将表拆分为多个表或进行以下黑客攻击之外,实际上没有解决方法:

      SELECT * FROM table WHERE id BETWEEN 250000 AND 250000 + 100 - 1
      ;or
      SELECT * FROM table WHERE id > 250000 ORDER BY id ASC LIMIT 100
      

      但这仍然不能准确地模拟LIMIT 运算符对复杂查询的功能。这是速度:功能机会成本。

      【讨论】:

        【解决方案3】:

        这真的是整个查询,还是您也有 ORDER BY 子句?因为这会严重减慢这样的查询。不过,如果您可以获得有关您订购的全套物品的索引,应该会有所帮助。

        【讨论】:

        • 请提交这样的帖子作为评论,而不是答案。这不是答案。
        【解决方案4】:

        如果你有一个自动增量字段,你可以这样做:

        SELECT * FROM table 
        WHERE ID > @LastID 
        ORDER BY ID
        LIMIT 100
        

        【讨论】:

        • 假设数据从未被删除,也就是说。
        猜你喜欢
        • 2019-03-16
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2023-04-10
        • 2018-03-06
        • 2011-11-06
        • 1970-01-01
        相关资源
        最近更新 更多