我有一个带有用户“投票”表和“用户”表的数据库。我认为数据库会在很短的时间内变得相当大,所以我想使用最有效的方法。
我想我可以每次都使用“votes”表中的 WHERE 语句计算投票数量,或者我可以将分数存储在“user”表中,每次投票时将其增加 1添加。
哪个最好/最快,和/或有其他方法吗?
我有一个带有用户“投票”表和“用户”表的数据库。我认为数据库会在很短的时间内变得相当大,所以我想使用最有效的方法。
我想我可以每次都使用“votes”表中的 WHERE 语句计算投票数量,或者我可以将分数存储在“user”表中,每次投票时将其增加 1添加。
哪个最好/最快,和/或有其他方法吗?
如果您正在考虑最好的方法。您必须考虑很多优化和缓存。
我想说, 在用户表上创建一个列来存储缓存的分数,但在单独的表上维护分数。
每当分数变化时,分数表的操作就会触发用户表的更新,并使用最新的分数结果。
这样做,你的分数数据可以扩展,有点像 stackoverflow 用于投票的东西。
在适当的配置中(默认配置在大多数情况下已经足够好了)MySQL 5.0+ 服务器正在缓存 SUM,COUNT 查询,因此 MySQL 会自动处理这类查询。
但是,如果您使用的是旧版本(MySQL 4 或更低版本),我建议将 COUNT(*) 值存储在数据库中,因为它确实会影响更大表的性能。
编辑:我发现的最佳实践是每次用户添加/删除投票/评论等时进行一次 COUNT(*) 查询。现代 SQL 服务器可以很好地处理组查询,因此我们不必担心性能。
预计算是经常去规范化的优化之一。
因此,只需创建预先计算的列并使用触发器或您的应用程序代码对其进行维护。
正如@Bohemian 指出的那样:只有在遇到性能问题时才需要这样做。
这是成本和复杂性的权衡。通过维护用户表中的计数,它增加了一些复杂性以保持其准确性,并且增加了插入/删除投票的成本。这意味着添加投票需要(至少)更新两个表。
因此,这在一定程度上取决于哪个部分需要最有效。如果检索投票计数的次数非常多,那么保持计数可能是有意义的。
不过,在我看来,最好先使用更简单的实现,并假设数据库将能够优化查询并使其成为非问题。如果结果不够快,那么稍后进行更改以添加预先计算的计数。