2012-07-21 79 views
2

我有一个经常更新(插入/删除)的表。我还有一个脚本来定期统计表中存储了多少条记录。我如何优化性能?MySQL数据库优化

  1. 什么也不做:只需使用COUNT函数。
  2. 创建另一个字段来存储记录的数量:每当添加新记录时,我们增加该字段,反之亦然。
+0

什么是您的表引擎类型? innodb,myisam,记忆......? – ajreal 2012-07-21 17:22:03

+1

在这种情况下'COUNT' **验证**是否太慢? (有*没有性能数字发布*,因此我只能想象这是一个假设的问题。)非规范化的方法是,非规范化..除了包含重复的数据,更新的问题可能会导致*不正确的信息* 。 – 2012-07-21 17:33:03

回答

3

如果你的数据库的主要功能是存储(经常插入/更新),切换存储引擎InnoDB,这是更快与INSERTUPDATE查询,但慢读。

阅读全文here,herehere

+0

是真的,innodb在写入方面有更好的表现,但查找表的行数是READ。 – ajreal 2012-07-21 17:28:29

0

方法#2几乎是这样做的标准方式(如果您的表格非常庞大并且COUNT会给您带来性能问题)。您还可以将COUNT值存储在MEMORY表中,这将使检索速度非常快。

如您所见,递增/递减。

+0

是的,但是...不是在这个原因。目的是在没有任何过滤的情况下统计表中的行数。 – ajreal 2012-07-21 17:27:35

+0

确实如此。不仅如此,Postgres本质上还是用它的特殊序列对象来完成这一切 - 有时在表本身存储序列(如mySQL)会成为OP正在经历的性能瓶颈。 – 2012-07-21 17:30:49

+0

mysql已经有一个信息模式来为每个表提供行计数的统计信息... http://dev.mysql.com/doc/refman/5.5/en/tables-table.html(ps:为myisam工作) – ajreal 2012-07-21 17:33:51

0

如果您需要准确的数字,我会将其构建到应用程序中更新数据库或使用触发器来保持计数最新。正如其他人所提到的,如果需要性能和持久性,可以将计数保存在MEMORY表或Redis实例中。 INFORMATION_SCHEMA.TABLES表中存在计数,但它们对于InnoDB并不精确(+ -20%或更多)。