2010-07-22 40 views
6

我正在構建一個MySQL數據庫,其中包含有關酵母物種中DNA的特殊子串的條目。我的表如下所示:對文本字段COUNT和GROUP BY似乎很慢

+--------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+--------------+---------+------+-----+---------+-------+ 
| species  | text | YES | MUL | NULL |  | 
| region  | text | YES | MUL | NULL |  | 
| gene   | text | YES | MUL | NULL |  | 
| startPos  | int(11) | YES |  | NULL |  | 
| repeatLength | int(11) | YES |  | NULL |  | 
| coreLength | int(11) | YES |  | NULL |  | 
| sequence  | text | YES | MUL | NULL |  | 
+--------------+---------+------+-----+---------+-------+ 

大概有180萬條記錄。在一個類型的查詢我想看看有多少DNA子與各類型品種和區域相關的,所以我發出這個查詢:

select species, region, count(*) group by species, region; 

種類和地區列只有兩個可能的條目(保守/ scer對於物種以及啓動子/區域編碼),但該查詢大約需要30秒

這是一個正常的時間期望這種類型的查詢給定的表的大小?這是慢的,因爲我使用文本字段而不是簡單的整數或布爾值(我喜歡文本字段,因爲幾個非CS研究人員將使用數據庫)。任何其他想法和建議都會受到歡迎。

請原諒,如果這是一個頭腦問題,我是一名SQL初學者。

P.S.我也看到了this question,但提議的解決方案似乎與我正在做的事情沒有關係。

編輯:將這些字段轉換爲VARCHAR將運行時間減少到約2.5秒。注意我也對它有相似時間的ENUM進行計時。

+0

哪個字段是您的主鍵? – 2010-07-22 02:55:11

+0

我沒有主鍵。我可以人爲製造一個,但它會影響嗎? – Rich 2010-07-22 04:17:32

回答

6

爲什麼所有基於字符串的列都定義爲TEXT?如果閱讀性能比較,您會發現TEXT比使用相同索引的VARCHAR列慢3倍:http://forums.mysql.com/read.php?24,105964,105964

+0

好的,沒有注意到它們是'text'。 – 2010-07-22 03:15:50

+0

我做了TEXT,因爲一個同事我說這和VARCHAR沒有任何區別:)使用VARCHAR將我的運行時間從33秒縮短到了2.5秒 – Rich 2010-07-22 04:43:45

+0

@Rich:哇 - 沒有想到會有這麼大的差異,如果你將物種和區域列更改爲保存其各自值的表的外鍵。INT總是4個字節,而VARCHAR(4)是5,因此您可以想象VARCHAR(100)有多少個字節。 – 2010-07-22 15:34:24

3

如果你的領域只有2個值,那麼你最好使他們成爲布爾值。除非有真正的原因,你應該把所有的東西都做成NOT NULLNULL

另請參閱ENUM type以更好地使用列的有限數量的可讀取值。

至於速度慢,首先要嘗試的是在您的列上創建索引。對於你在這裏展示的特定查詢,上species, region索引應該產生巨大的變化:

create index on mytablename (species, region); 

應該這樣做。

+2

您確定該指數會與這種低基數數據產生巨大差異嗎? – 2010-07-22 02:59:22

+1

不,我不確定,但我認爲這是一個很好的猜測。我開始寫一些關於使用'EXPLAIN'的文章,但它開始變成一堆蠕蟲。我猜想最終結果可能是我們應該嘗試創建索引。 – Vineet 2010-07-22 03:11:56

+0

我試過索引,但沒有區別。我也嘗試過VARCHAR,因爲OMG Ponies建議它快得多。之後,我嘗試了對枚舉,而VARCHAR沒有明顯的加速。 – Rich 2010-07-22 04:42:49