2015-08-17 35 views
1

我有4列,描述爲原始表如下:如何優化使用COUNT(*)和組MySQL查詢BY

+----------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+----------+-------------+------+-----+---------+-------+ 
| FieldID | varchar(10) | NO | MUL | NULL |  | 
| PaperID | varchar(10) | NO |  | NULL |  | 
| RefID | varchar(10) | NO |  | NULL |  | 
| FieldID2 | varchar(10) | NO | MUL | NULL |  | 
+----------+-------------+------+-----+---------+-------+ 

我想與COUNT(*)GROUP BY運行查詢:

select FieldID, FieldID2, count(*) from nFPRF75_1 GROUP BY FieldID, FieldID2 

我已經在列FieldID和列FieldID2上創建索引,但是,它們似乎無效。我也嘗試過OPTIMIZE table_name並在這兩列創建了冗餘索引(如其他優化問題所示),但不幸的是它也沒有解決。

以下是我從EXPLAIN得到:

| id | select_type | table  | type | possible_keys | key | key_len | ref | rows  | Extra       | 
+----+-------------+-----------+------+---------------+------+---------+------+----------+---------------------------------+ 
| 1 | SIMPLE  | nFPRF75_1 | ALL | NULL   | NULL | NULL | NULL | 90412507 | Using temporary; Using filesort | 

我不知道是否有反正我可以在此查詢,或其他任何方式來優化其使用索引。現在它的效率很低,因爲有很多線路。

非常感謝您的幫助!

+1

你可以參考這個問題http://stackoverflow.com/questions/3915574/mysql-optimization-group-by-multiple-keys –

回答

2

您應該創建(FieldID,FieldID2)的多列索引。

+0

謝謝它的作品!我想知道爲什麼單列索引在這種情況下不起作用。 (對不起,我是sql新手......) –

+0

在這種情況下,單列索引不能很好地工作,因爲在查詢時仍有太多工作要做。即使每個FieldID平均只有100個FieldID2,爲了統計每個FieldID/FieldID2的唯一組合,您的數據庫仍必須查看每個唯一的FieldID2以便對它們進行計數(而不僅僅是100)。所以即使你分別在每一列上有一個索引,仍然有太多工作要做。如果您有多列索引,那麼在插入時所有的分組已經完成,只剩下〜100個實例上的「count」執行。希望有所幫助! –

+0

我明白了,這很有道理!非常感謝解釋! –

0

如果您按照它們進行分組,請創建一個FieldID索引FieldID2。這必須提高速度。

此外,我建議你改變計數(*)來計數('myIntColumn'),這也提高了速度。

+0

長度只有10個字符的Varchar字段不會有太大的性能影響。 –

+0

@RobBailey如果她有90412507行,我認爲這將是 –

+0

對不起,我是一個在MySQL新手。當FieldID的原始數據包含數字以外的字符時,我可以使用int字段嗎?像'173F24A5'? –