如果我正在制作邮件应用程序(例如电子邮件),我必须计算邮件数量。
我每次都会更好地计算邮件,或者我应该创建一个名为numOfMsg
的新列,并在收到邮件时将其递增。
编辑:
似乎phpBB http://wiki.phpbb.com/Table.phpbb_topics将回复号码存储在数据库中,是否有人知道他们的意图是什么?
答案 0 :(得分:1)
这是一个很好的问题,答案可能取决于您的申请规模。保持运行计数肯定会使您在需要时更容易/更快地检索这些数字,但它也会使您的代码变得更加复杂,因为每次插入,删除或移动消息时都必须跟踪邮箱/文件夹(如果这是您的应用程序允许的内容)。
如果你愿意努力使计数保持最新状态,那么对于那种事情来说,这可能是一个很好的方法。
我当然在我编写的代码中使用那种状态计数器。
答案 1 :(得分:1)
当然,缓存消息计数更快。但是如果你有正确的索引,假设一个用户没有100万条消息,那么计数就足够了。它当然也取决于存储引擎(例如基于列的存储引擎在aggragate功能上更快) 但假设您每次都在选择用户数据,将消息计入同一行会每次保存一个查询。
我的建议是 - 除非有性能影响,否则请计算。当性能因计数而减少时,请缓存计数。即使缓存不够,您也可以考虑对数据库进行非规范化。过早的优化没有用,答案实际上取决于应用程序的规模,以及新消息的频率。
答案 2 :(得分:1)
您可以使用MySQL函数COUNT()
来计算消息。如果使用适当的索引,这非常快。 (如果按用户+框进行计数,则需要在用户+框上设置组合索引)
请注意,MySQL也会缓存您的查询结果,因此只要没有新消息到达[您的消息表未更改],它甚至不会返回内存/磁盘来进行实际计数;它只会返回最后一个值。所以这是一个非常便宜的操作。
保留额外冗余信息的麻烦在于保持最新信息可能非常困难;你可以添加或删除消息;有些用户可能会在框之间移动消息,而且所有这些时间都必须保持计数器的正确性。您还必须开始使用事务来确保消息的INSERT和计数器的UPDATE都已完成或两者都未完成(例如,当您丢失连接或崩溃时)。
答案 3 :(得分:0)
拥有numOfMsg
字段imo不是一个好主意,因为您必须跟踪程序中的数字。无论如何,MySQL optimizes COUNT(*)我怀疑它会成为你应用程序的瓶颈。