拥有一个巨大的mysql表,其中有300,000条记录,并希望以这种方式用PHP查询PHP中的记录(尽管这里不是重点):
SELECT * FROM `table` LIMIT 250000, 100
在记录的后半部分可能会非常缓慢,特别是在接近表格末尾时(LIMIT开始非常大)。我的猜测是MySQL在将结果舀到我之前必须一直计算到250000?
那么如何解决这种或任何其他分页方法可能会更快?谢谢!
答案 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