所以我有一个有 500 万行多一点的表。当我使用 SQL_CALC_FOUND_ROWS 时,查询会永远挂起。当我把它拿出来时,查询会在一秒钟内执行 LIMIT ,25。我的问题是出于分页原因,是否有替代获取总行数的方法?
问问题
23743 次
3 回答
7
SQL_CALC_FOUND_ROWS 强制 MySQL 扫描所有匹配的行,即使它们永远不会被获取。在内部,它相当于在没有 LIMIT 子句的情况下执行相同的查询。
如果您通过 WHERE 进行的过滤不是太疯狂,您可以计算并缓存各种类型的过滤器以节省 calc_found_rows 施加的全扫描负载。对于大多数可能的 where 子句,基本上运行“select count(*) from ... where ....”。
否则,您可能会采用 Google 风格,只是吐出一些偶尔与现实无关的页码(您知道,您会看到“Goooooooooooogle”,进入第 3 页,然后突然用完结果)。
于 2011-01-22T03:07:31.717 回答
5
于 2011-01-24T05:04:27.223 回答
-1
您应该根据情况在 COUNT(*) 和 SQL_CALC_FOUND_ROWS 之间进行选择。如果您的查询搜索条件使用索引中的行 - 使用 COUNT(*)。在这种情况下,Mysql 将只从索引中“读取”而不接触表中的实际数据,而 SQL_CALC_FOUND_ROWS 方法将从磁盘加载行,这在大型表上可能是昂贵且耗时的。
本文@mysqlperformanceblog中有关此主题的更多信息。
于 2012-04-12T13:44:11.847 回答