2013-02-12 225 views
1

我有一個表由三個列(所有INT)的大約100萬行:SELECT COUNT(*)與GROUP BY緩慢的大表

id | c_id | l_id 

即使我用指數連最基本的

select count(*), c_id 
from table 
group by c_id; 

需要16秒(MYISAM)到25秒(InnoDB)才能完成。

有什麼方法可以在不跟蹤單獨表格中的計數的情況下加快此過程(例如,通過使用觸發器)?

/編輯:所有colums有指標

+2

你在這張桌子上有什麼指數? – Bridge 2013-02-12 11:18:58

+0

如果你需要數你可以簡單的使用count(id)爲什麼使用*。請避免使用*,而不要使用列。 – 2013-02-12 11:24:13

+0

@raheel shan,你錯了,如果c_id被索引,count(id)將會變慢,看到我的回答執行計劃 – Michael 2013-02-12 11:29:37

回答

1

可能的方式做同樣的查詢SqlFiddle見執行計劃,

SELECT COUNT(id)會更快,如果c_id未在測試集收錄我已經提供了添加一個索引。

否則您應該使用COUNT(*),因爲索引的優化可能不會用在查詢中。

它也取決於DB中的行數和引擎類型,因爲mysql會根據這個事實決定哪個更好。

在執行select之前,您應該始終通過鍵入EXPLAIN來查看查詢的執行計劃。

我不得不說,在大多數情況下,在大數據集上,COUNT(*)COUNT(id)應該導致相同的執行計劃。

1

這不是Count(*),讓性能問題,但100萬行分組。

你應該在C_ID列

+0

最初忘了提及指數是存在的。雖然'count(*)'在使用MyISAM時可能不是問題,但InnoDB肯定會對InnoDB起作用(單獨執行'count(*)'需要20秒)。 – leepfrog 2013-02-12 12:07:31