每次COUNT()函数,还是存储值并将其递增1?

时间:2012-05-03 23:30:56

标签: mysql database performance record-count

我有一个包含用户'投票'表和'用户'表的数据库。我认为数据库会在很短的时间内变得非常大,所以我想使用最有效的方法。

我想我每次都可以用“投票”表格中的WHERE语句COUNT()投票数量,或者我可以将得分存储在“用户”表中,每次只增加1投票被加入。

哪个最好/最快,和/或有没有其他方法可以做到这一点?

4 个答案:

答案 0 :(得分:2)

如果您正在考虑最好的方法。你必须深入研究优化和缓存。

我会说, 在用户表上创建一个列以存储缓存的分数,但在单独的表上保留分数。

每当得分更改操作得分表并使用最新得分结果触发用户表上的更新。

这样做,你的得分数据具有可扩展性,就像stackoverflow用于投票一样。

答案 1 :(得分:1)

在正确配置中(默认配置在大多数情况下都足够好)MySQL 5.0+服务器缓存SUM,COUNT查询,因此MySQL会自动处理这类查询。

但是如果您使用的是旧版本(MySQL 4或更低版本),我建议在数据库中存储COUNT(*)值,因为它确实会导致更大的表格的性能。

编辑:我发现的最佳做法是每次用户添加/删除投票/评论等时都会进行COUNT(*)查询。现代SQL服务器正在很好地处理群组查询,所以我们不要不得不打扰性能。

答案 2 :(得分:0)

预先计算是经常非规范化优化之一。

因此,只需创建预先计算的列并使用触发器或应用程序代码进行维护。

@Bohemian指出:如果遇到性能问题,你需要

答案 3 :(得分:0)

这是成本和复杂性的权衡。通过维护用户表中的计数,它增加了一些复杂性以保持其准确性,并且增加了插入/删除投票的成本。这意味着添加投票则需要(至少)更新两个表。

所以这取决于哪一块需要最有效率。如果检索计票次数的次数非常多,那么保持计数可能是有意义的。

在我看来,最好先使用更简单的实现,并假设数据库能够优化查询并使其成为无问题。如果结果不够快,则进行更改以便稍后添加预先计算的计数。