可能重复:
没有双重查询的 MySQL 分页?
我的网站上有一个搜索框,其中包括分页。
要设置分页,我必须知道匹配的数量,所以我考虑了两个选项:
- 使用 2 个查询:查询页面中的 X 个匹配项(使用
limit
),以及一个查询总共有多少匹配项。 - 使用 1 查询:获取所有匹配项,然后我知道行数,然后通过使用获取所需的行
array_slice
我认为解决方案#2更好,你怎么看?
可能重复:
没有双重查询的 MySQL 分页?
我的网站上有一个搜索框,其中包括分页。
要设置分页,我必须知道匹配的数量,所以我考虑了两个选项:
limit
),以及一个查询总共有多少匹配项。array_slice
我认为解决方案#2更好,你怎么看?
在 MySQL 中,您可以添加SQL_CALC_FOUND_ROWS
到查询中,然后运行SELECT FOUND_ROWS();
:
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows
答案实际上取决于您预期匹配的行数以及存储在行中的数据大小。
传统的分页方法是使用 SQLLIMIT
子句返回整个结果集的子集。如果您实际上需要知道全部记录数(以显示全部“页数”),那么您还需要进行 aSELECT COUNT(primary_key_field) FROM table WHERE [search condition]
以获得该信息。
这通常会提供最佳结果,因为 COUNT 查询应该能够非常快速地执行,并且只要您在用于排序的字段上有索引(因为您总是想要一个ORDER BY
以及LIMIT
保证订单)。这也意味着您需要在应用程序的内存中保留的记录更少。
我确实认为在某些用例中,单一查询方法可能会更好(即不会有大量潜在行,行数据大小很小),这样您就没有大量的数据传输时间检索完整结果集的内存使用情况。
真的,您只需要在您的应用程序中测试一些场景,看看什么最适合您。