2012-07-16 55 views
3

我有一個表message_message 3000000條記錄。innoDB緩慢計數(*)

當我做一個COUNT(*)查詢,這是非常緩慢...:

的mysql>select count(*) from message_message;

+ ---------- +

| count(*)|

+ ---------- +

| 2819416 |

+ ---------- +

1行中組(2分鐘35.35秒)

解釋: 的MySQL>explain select count(*) from message_message;

| id | SELECT_TYPE |表| |鍵入| possible_keys |鍵| key_len | ref | rows | Extra |

| 1 | SIMPLE | message_message | index | NULL | PRIMARY | 4 | NULL | 2939870 |使用index |

1排(0.02秒)

會發生什麼?

+0

你需要一個確切的數字,還是將估計做? – 2012-07-16 13:50:37

+0

Django管理員需要一個確切的分頁號碼:( – 2012-07-16 14:05:58

+0

http://stackoverflow.com/questions/10433173/prevent-django-admin-from-running-select-count-on-the-list-form sloved! – 2012-07-17 00:37:32

回答

3

看看InnoDB中的This Post你需要做一個全表掃描,其中MyISAM中的索引讀取。

如果您使用where子句,儘管它將執行模式更改爲使用索引,所以通常InnoDB在完全不受限制的計數上會比MyISAM慢,其中性能與受限計數相匹配。

+0

感謝這篇文章,使用where子句時速度更快 – 2012-07-16 14:07:28

0

如果要計算記錄數量,最好查詢整個表並使用結果集的num_rows屬性。 Count(...)通常用於想要進行聚合查詢時(與GROUP BY結合使用)。

+0

這並沒有真正回答這個問題。 – 2012-07-16 14:48:28