2013-11-01 44 views
1

我有一個mysql表,它存儲有關我們的用戶在每分鐘的基礎上的狀態信息,但插入已經開始需要長達30秒才能完成 - 我們仍然在只有幾十個用戶的私人測試版,但需要能夠處理數千人。如何提高Mysql表上的性能 - 索引,集羣,PK?

使用信息:

  • 插入:一個新行插入每分鐘一次,每用戶
  • 更新:每隔幾分鐘最後幾排將與修正後的數據進行更新,每個用戶
  • 刪除:超過6個月前刪除的條目每天刪除一次
  • 選擇:每天只有約10個用戶選擇每個用戶(某些用戶每天選擇所有行,某些用戶只能獲取用戶的最近行。 )
  • 我們正在使用AWS RDS,若影響任何東西(mysql的5.5.27)

這是我繼承表定義:

CREATE TABLE statusMonitor (
    personId   int(10) unsigned NOT NULL, 
    monitorDateTime datetime   NOT NULL, 
/* 
Other columns 
*/ 
    UNIQUE KEY UQIX_statusMonitor (personId,monitorDateTime) USING BTREE, 
    KEY personId (personId,monitorDateTime/* other cols */) 
) ENGINE = MyISAM; 

我心目中有三個變化,我是否在正確的軌道上?

  1. InnoDB的會比MyISAM的一個高臺寫一個更好的選擇。
  2. 我想這樣做基於的日第一索引效率會更高
  3. 一個主鍵將集羣中的數據進行查詢速度更快,並插入將物理靠得更近。

因此,這將是我的新定義:

CREATE TABLE statusMonitor (
    personId   int(10) unsigned NOT NULL, 
    monitorDateTime datetime   NOT NULL, 
/* 
Other columns 
*/ 
    PRIMARY KEY (
     monitorDateTime, 
     personId 
), 
    UQIX_statusMonitor (monitorDateTime,personId) USING BTREE, 
    KEY personId (monitorDateTime,personId/* other cols */) 
) ENGINE = InnoDB; 

因爲我們有相當一些用戶,我可以負擔得起通過改變表定義,打破東西了一小會兒,但更希望得到正確的結果第一次,所以它只發生一次。

回答

1

InnoDB將是很好的,如果你有很多的插件,因爲每鎖全表的MyISAM情況下,和在InnoDB情況下,只有一排。 你也可以考慮垂直和/或水平分區。 小心使用KEY,其中太多會減慢請求速度。