2009-07-11 67 views
14

有一天,我懷疑我必須學習hadoop並將所有這些數據傳輸到非結構化數據庫,但是我很驚訝地發現在如此短的時間內性能如此顯着地下降的時間。在600萬行表上的Mysql性能

我有一個不到600萬行的mysql表。 我在這個表上做了一個非常簡單的查詢,並且相信我有所有正確的索引。

查詢是

 
SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date 

,所以我使用了正確的索引解釋回報

 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE updateshows  range date_idx date_idx 7 NULL 648997 Using where 

,據我所知道的,但這種查詢花費11秒運行。

數據庫是MyISAM,phpMyAdmin說這個表是1.0GiB。

這裏的任何想法?

編輯: date_idx索引日期和venid列。這些應該是兩個單獨的索引?

+0

你有什麼指數? – Pafjo 2009-07-11 21:05:46

+0

你的解釋查詢表示它必須掃描648997行(可能它不會有效地使用索引,我會將它們分類索引爲我)。實際返回了多少行? – nos 2009-07-11 22:53:39

+0

什麼是現在的狀態 – 2014-04-14 19:06:23

回答

38

你想確保查詢只使用索引,因此請確保索引涵蓋了所有你選擇的字段。另外,由於它涉及到範圍查詢,因此需要首先在索引中存儲venid,因爲它被查詢爲常量。因此,我想創建和索引,像這樣:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time); 

有了這個指標,是必須完成的查詢在索引中的所有信息。這意味着,希望存儲引擎能夠獲取信息,而無需在表內自己尋找。但是,MyISAM可能無法做到這一點,因爲它不會將數據存儲在索引的葉子中,所以您可能無法獲得所需的速度增加。如果是這種情況,請嘗試創建表的副本,並在副本上使用InnoDB引擎。在那裏重複相同的步驟,看看你是否得到顯着的速度提高。 InnoDB 確實將字段值存儲在索引樹葉中,並允許覆蓋索引。

現在,希望你能看到下面的,當你解釋查詢:

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date; 

id select_type table type possible_keys  key  [..] Extra 
1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where 
2

嘗試添加跨越venid和日期鍵(或周圍的其他方式,或兩者...)

+0

當你說'添加一個鍵',你的意思是一個索引?我編輯了我的條目,指出date_idx同時位於日期和venid字段上。 – pedalpete 2009-07-11 21:20:06

+0

你也需要'時間' – 2009-07-11 21:57:17

1

嘗試把一個索引的列venid

2

我會想象一個6M行的表應該可以用比較正常的技術進行優化。

我假設你有一個專用的數據庫服務器,它有一個合理的內存量(比如8G)。

你會想確保你已經調整了mysql來有效地使用你的ram。如果您正在運行32位操作系統,請不要。如果您正在使用MyISAM,請調整您的關鍵緩衝區以使用顯着比例但不太多的內存。

在任何情況下,您都希望在生產級硬件上運行重複的性能測試。