Mysql SQL_CALC_FOUND_ROWS和分页

时间:2011-01-22 03:00:41

标签: mysql pagination sql-calc-found-rows

所以我的表有一个超过500万行。当我使用SQL_CALC_FOUND_ROWS时,查询将永远挂起。当我拿出它时,查询会在一秒内执行LIMIT,25。我的问题是分页原因是否有替代方法可以获得总行数?

3 个答案:

答案 0 :(得分:7)

SQL_CALC_FOUND_ROWS强制MySQL扫描所有匹配的行,即使它们永远不会被获取。在内部,它相当于在没有LIMIT子句的情况下执行的相同查询。

如果您通过WHERE进行的过滤不是太疯狂,您可以计算并缓存各种类型的过滤器,以节省calc_found_rows强加的全扫描负载。对于大多数可能的where子句,基本上运行“select count(*)from ... where ....”。

否则,您可以采用Google风格,只是吐出一些偶尔与现实没有任何关系的页码(你知道,你看到“Goooooooooooogle”,到第3页,然后突然用完了结果)。 / p>

答案 1 :(得分:5)

详细说明如何实施Google风格pagination using MySQL

答案 2 :(得分:-1)

您应该根据情况在COUNT(*)和SQL_CALC_FOUND_ROWS之间进行选择。如果查询搜索条件使用索引中的行 - 请使用COUNT(*)。在这种情况下,Mysql将仅从索引“读取”而不触及表中的实际数据,而SQL_CALC_FOUND_ROWS方法将从磁盘加载行,这对于大规模表来说是昂贵且耗时的。

this article @mysqlperformanceblog中有关此主题的更多信息。