2012-07-21 80 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%或更多)。