我有一个MySQL数据库和一个大约128,000行的表(根据我的理解,它非常小)。我还有一个连接到它的应用程序,它被设置为进行分页。我的SQL查询看起来像这样:
SELECT * FROM Documents WHERE PortfolioId = ? LIMIT ?,?
SELECT * FROM Documents WHERE PortfolioId = ? ORDER BY Date DESC LIMIT ?,?
我的问题是双重的。首先,无论使用哪个查询,第一个“LIMIT”数字越高,查询返回的速度越慢,最终会进入不可接受的延迟。例如,如果我去phpmyadmin并执行:
SELECT * FROM Documents WHERE PortfolioId = 1 LIMIT 0,20
查询需要0.001秒。但是,当我执行此操作时:
SELECT * FROM Documents WHERE PortfolioId = 1 LIMIT 120000,20
查询需要14.8秒。
我的第二个问题是,我按日期排序的第二个查询(也在表中编入索引)使得相应的查询花费更多,更长的时间(第一个示例为.1秒, 2分钟,第二个例子的23秒。
是否有更好的方法来执行这些查询,以便它们更快?根据我的理解,开发人员经常在具有数百万行的表上实现分页,但是这样做,后续页面加载需要很长时间。
答案 0 :(得分:1)
随着你越往结果集越来越远,LIMIT总会越来越慢。基本上它与获取前X行并扔掉它们并没有太大区别,因为你只对X + 1感兴趣 - > X + 10。唯一的区别是没有浪费时间在线上发送未打好的行--MySQL仍然必须构建整个结果集,对其进行排序,然后向下滚动到你的LIMIT偏移点。你的偏移越深,MySQL必须做的工作越多,然后基本上就扔掉了。