我应该何时考虑在一个字段中保存总计数?

时间:2012-01-30 13:13:36

标签: php mysql database performance

例如,如果我必须计算属于文章的评论,很明显我不需要缓存评论总数。

但是如果我想分页包含100万张照片的画廊(WHERE status = 1)怎么办?我应该在一个名为count或SELECT count(id)的表中将其保存为总计每次都可以吗?

还有其他解决方案吗?

请指教。感谢。

3 个答案:

答案 0 :(得分:4)

对于MySQL,您不需要存储计数,您可以使用SQL_CALC_FOUND_ROWS来避免两次查询。

如,

SELECT SQL_CALC_FOUND_ROWS * 
FROM Gallery
WHERE status = 1
LIMIT 10;
SELECT FOUND_ROWS();

从手册:

  

在某些情况下,需要知道语句的行数   没有LIMIT就会返回,但是没有运行   声明再次。要获得此行数,请包含a   SELECT语句中的SQL_CALC_FOUND_ROWS选项,然后调用   之后是FOUND_ROWS()。

示例用法here

答案 1 :(得分:2)

这取决于该表上有100万条记录的查询量。考虑只是处理好的索引,特别是多列索引(因为它们很容易忘记:here.这将做很多事情。并且,确保查询在您的服务器上也能很好地缓存。

如果您经常使用此列,请考虑保存它(如果它不能被MySQL缓存),因为事情可能会变慢。但大多数情况下,良好的索引都会照顾它。

最佳尝试:设置一些测试以确定查询是否仍然很快并且在连续执行很多次时性能没有下降。

EXPLAIN [QUERY] 

使用该命令(在MySQL中)获取有关执行查询的方式以及是否可以改进的信息。

答案 2 :(得分:1)

每次进行计数都没问题。

在分页期间,您仍可以使用SQL_CALC_FOUND_ROWS

注意:

  1. 非正规计数将变得陈旧
  2. 没有人会分页这么多项目