我有一個表由三個列(所有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有指標
我有一個表由三個列(所有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有指標
可能的方式做同樣的查詢SqlFiddle見執行計劃,
SELECT COUNT(id)
會更快,如果c_id
未在測試集收錄我已經提供了添加一個索引。
否則您應該使用COUNT(*)
,因爲索引的優化可能不會用在查詢中。
它也取決於DB中的行數和引擎類型,因爲mysql會根據這個事實決定哪個更好。
在執行select之前,您應該始終通過鍵入EXPLAIN
來查看查詢的執行計劃。
我不得不說,在大多數情況下,在大數據集上,COUNT(*)
和COUNT(id)
應該導致相同的執行計劃。
這不是Count(*)
,讓性能問題,但100萬行分組。
你應該在C_ID列
最初忘了提及指數是存在的。雖然'count(*)'在使用MyISAM時可能不是問題,但InnoDB肯定會對InnoDB起作用(單獨執行'count(*)'需要20秒)。 – leepfrog 2013-02-12 12:07:31
你在這張桌子上有什麼指數? – Bridge 2013-02-12 11:18:58
如果你需要數你可以簡單的使用count(id)爲什麼使用*。請避免使用*,而不要使用列。 – 2013-02-12 11:24:13
@raheel shan,你錯了,如果c_id被索引,count(id)將會變慢,看到我的回答執行計劃 – Michael 2013-02-12 11:29:37