2011-07-12 43 views
3

如果我正在制作消息应用程序(例如电子邮件),并且我不得不计数消息的数量。MySQL计数性能

我会变得更好,每次计数的消息,或者我应该创建一个名为numOfMsg新列并在收到消息时增加它。

编辑:

好像phpBB的http://wiki.phpbb.com/Table.phpbb_topics店的答复号在数据库中,没有人知道他们的意图是?

+0

这取决于您是计算消息表的所有行还是其中的一部分,例如,基于辅助键的一个邮箱的消息?此外,您的消息表的大小很重要。如果你有适当的指数,我不会担心大小在10万行以下的表格。 – Martijn

回答

1

你可以使用MySQL的函数COUNT()计数的消息。如果你使用适当的指数,这非常快。 (如果你通过用户+盒子计数,你将希望在用户+盒子上有一个组合索引)

请注意,MySQL也会缓存你的查询结果,所以只要没有新消息到达[你的消息表不变],它甚至不会回到内存/磁盘来做实际计数;它只会返回最后一个值。所以非常便宜的操作。

与保持额外的冗余信息是,它可能很难保持这些最新的麻烦;您可以添加或删除邮件;一些用户可能会在两个盒子之间移动消息,并且所有这些都必须保持计数器正确。您还必须开始使用事务来确保消息的INSERT和计数器的更新既可以完成,也可以两者都没有完成(例如,当您失去连接或者某些事件崩溃时)。

1

这是一个很好的问题,答案可能取决于你的应用规模。保持运行的计数结果肯定会让您在需要时更容易或更快地检索这些数字,但它也会使您的代码变得更加复杂,因为每次插入,删除或移动消息时都必须保持跟踪邮箱/文件夹(如果这是您的应用程序允许的)。

如果你愿意去努力保持计数了最新的,它可能对那种事情的好办法。

我当然在代码中使用那种状态计数器。

0

这不是一个好主意,有一个numOfMsg场海事组织,你一定要跟踪数在程序中,。无论如何,MySQL optimizes COUNT(*),我怀疑这将是你的应用程序的瓶颈。

+1

MySQL仅在没有WHERE(即对于整个表)的情况下优化COUNT(*),并且只对MyISAM表进行优化。 – Mchl

+0

是的,仅适用于MyISAM,但即使使用WHERE,也会设置适当的索引。 – Jacob

1

当然,高速缓存消息数量更快。但是,如果您拥有正确的索引,并且假设一个用户没有一百万条消息,则计数速度足够快。它当然也取决于存储引擎(例如,基于列的存储引擎在集成功能方面速度更快) 但是,假设您每次选择用户数据,将消息计入同一行,每次都会节省一次查询。

我的建议是 - 除非它对性能有影响,否则要继续计数。由于计数导致性能下降时,缓存计数。甚至当缓存不够时,您可以考虑对数据库进行非规范化。过早优化没有用,答案真的取决于应用程序的规模,以及新消息的发生频率。