使用PHP分页时MySQL大表性能问题

时间:2009-04-12 02:09:46

标签: mysql database performance

拥有一个巨大的mysql表,其中有300,000条记录,并希望以这种方式用PHP查询PHP中的记录(尽管这里不是重点):

SELECT * FROM `table` LIMIT 250000, 100 

在记录的后半部分可能会非常缓慢,特别是在接近表格末尾时(LIMIT开始非常大)。我的猜测是MySQL在将结果舀到我之前必须一直计算到250000?

那么如何解决这种或任何其他分页方法可能会更快?谢谢!

4 个答案:

答案 0 :(得分:4)

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

你的桌子不是300k行的那么大。然而,在接近桌面时存在性能问题。对此唯一真正的解决方案是伪造限制条款。有一个自动增量字段,对1到300,000行进行编号,然后执行:

SELECT *
FROM mytable
WHERE field BETWEEN 250000 and 250100

或类似的。如果您经常删除行,那可能会有问题或者不可能,但我倾向于发现较旧的数据往往变化较小,因此您可以通过对前100,000行使用LIMIT和超出该行的代理调页列来对其进行某种程度的优化

答案 1 :(得分:1)

你是对的:在阅读你想要的行之前,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运算符对复杂查询的功能。这是一种速度:功能性机会成本。

答案 2 :(得分:0)

这真的是整个查询,还是你还有一个ORDER BY子句?因为这会严重减慢查询速度。如果你能得到你所订购的全套东西的索引,应该会有所帮助。

答案 3 :(得分:0)

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

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