2010-02-24 84 views
4

我試圖解決一個到MySQL-5.0分貝的延遲問題。優化易失性數據查詢

  • 查詢本身是非常簡單的:SELECT SUM(items) FROM tbl WHERE col = 'val'
  • 有上col的指標,有不超過10000個值在最壞的情況下,總結(平均count(items)col所有值將約爲10) 。
  • 該表有多達2M行。
  • 查詢運行足夠頻繁,有時執行時間上升到10秒,但其中99%採取< < 1S
  • 查詢是不是真的被緩存 - 在幾乎所有情況下,像這樣的每個查詢會然後在下一分鐘插入該表並顯示舊值不存在問題(計費信息)。
  • 鍵不夠好 - 〜100%命中

我在尋找的結果是每一個查詢< 1秒。有什麼方法可以在不改變表格的情況下改善選擇時間?或者,是否有任何有助於解決問題的有趣變化?我考慮過簡單地在每張表格插入一張表格,每張表格都會更新當前的總和 - 但也許有更好的方法可以做到嗎?

+0

你使用什麼存儲引擎? MyISAM還是Innodb? – Martin 2010-02-24 15:19:57

+0

我正在使用MyISAM。 – viraptor 2010-02-24 15:22:25

回答

2

另一種方法是增加一個彙總表:

create table summary (col varchar(10) primary key, items int not null); 

,並添加一些觸發器TBL使:

上插入:

insert into summary values(new.col, new.items) 
on duplicate key update set summary.items = summary.items + new.items; 

上刪除:

update summary set summary.items = summary.items - old.items where summary.col = old.col 

on update :

update summary set summary.items = summary.items - old.items where summary.col = old.col; 
update summary set summary.items = summary.items + new.items where summary.col = new.col; 

這會減慢你的刀片,而且允許你打在彙總表中的一行爲

select items from summary where col = 'val'; 

這樣做的最大問題是自舉彙總表的值。如果您可以使應用程序脫機,則可以使用tbl中的值輕鬆初始化摘要。

insert into summary select col, sum(items) from tbl group by col; 

但是,如果您需要保持服務運行,則要困難得多。如果您有副本,則可以停止複製,構建摘要表,安裝觸發器,重新啓動複製,然後將服務故障轉移到使用副本,然後在退役的主服務器上重複該過程。

如果你不能做到這一點,那麼你可以更新彙總表山坳一個值在同一時間,以減少影響:

lock table write tbl, summary; 
delete from summary where col = 'val'; 
insert into summary select col, sum(items) from tbl where col = 'val'; 
unlock tables; 

或者,如果你能忍受長時間的中斷:

lock table write tbl, summary; 
delete from summary; 
insert into summary select col, sum(items) from tbl group by col; 
unlock tables; 
+0

我喜歡它!謝謝。 – viraptor 2010-02-25 21:52:15

1

覆蓋索引應該有所幫助:

create index cix on tbl (col, items); 

這將使總和,而不從數據文件中讀取到執行 - 這應該會更快。

您還應該跟蹤鍵緩衝區的有效性以及是否需要爲其分配更多內存。這可以通過輪詢來完成的服務器的狀態和觀看「鍵%」值:

SHOW STATUS LIKE 'Key%'; 

MySQL Manual - show status

key_read_requests之間的比率(即,索引查找的數量。)與key_reads(即數。請求從磁盤讀取所需的索引塊)非常重要。磁盤讀取次數越多,查詢將運行得越慢。您可以通過增加配置文件中的keybuffer大小來改善這一點。

+0

我不知道總和可以使用索引 - 謝謝你。用於查找的鍵是好的 - 但正如我在問題中提到的那樣,我幾乎獲得了100%的索引點擊數,剩下很多內存。 – viraptor 2010-02-24 19:35:23

+0

你應該很好去。什麼導致偶爾的10s響應時間?服務器上有很多其他查詢活動嗎? – Martin 2010-02-24 21:13:46

+0

450qps +奴隸複製...所以是 - 很多 – viraptor 2010-02-25 12:34:23