所以我的表有一个超过500万行。当我使用SQL_CALC_FOUND_ROWS时,查询将永远挂起。当我拿出它时,查询会在一秒内执行LIMIT,25。我的问题是分页原因是否有替代方法可以获得总行数?
答案 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中有关此主题的更多信息。