2

我有一个 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 秒。

我的第二个问题是,我按日期排序的第二个查询(也在表中被索引)使相应的查询花费了很多很多的时间(第一个示例为 0.1 秒, 第二个示例为2 分 23 秒)。

有没有更好的方法来执行这些查询,所以它们更快?据我了解,开发人员经常在具有数百万行的表上实现分页,但是这样做会导致后面的页面加载需要很长时间。

4

1 回答 1

1

随着您进入结果集“更远”,LIMIT 总是会变慢。本质上,它与获取前 X 行并丢弃它们并没有太大区别,因为您只对 X+1 -> X+10 感兴趣。唯一的区别是通过网络发送未处理的行不会浪费时间 - MySQL 仍然必须构建整个结果集,对其进行排序,然后向下滚动到任何 LIMIT 偏移点。你的偏移量越深,MySQL 要做的工作就越多,然后基本上就扔掉了。

于 2012-07-15T05:43:06.400 回答