2016-05-18 32 views
1

當我剛開始使用MySQL時,select count(*)select count(1)幾乎是瞬間的。但是我現在使用的是Dreamhost版本5.6.25,有時需要20-30秒才能完成select count(1)。然而,第二次是快速的---就像索引被緩存---但不是超快速,就像數據來自元數據索引一樣。爲什麼mysql select count(1)花了這麼久?

有人明白髮生了什麼事,爲什麼發生了變化?

mysql> select count(1) from times; 
+----------+ 
| count(1) | 
+----------+ 
| 1511553 | 
+----------+ 
1 row in set (22.04 sec) 

mysql> select count(1) from times; 
+----------+ 
| count(1) | 
+----------+ 
| 1512007 | 
+----------+ 
1 row in set (0.54 sec) 

mysql> select version(); 
+------------+ 
| version() | 
+------------+ 
| 5.6.25-log | 
+------------+ 
1 row in set (0.00 sec) 

mysql> 
+0

和數據量與過去相似嗎? – michaJlS

+0

在我有10億行之前,我對每個查詢都得到了亞秒級響應。 – vy32

回答

4

我想當你第一次啓動時,你使用了MyISAM,現在你正在使用InnoDB。 InnoDB只是不存儲這些信息。請參閱文檔:Limits on InnoDB Tables

InnoDB不保留表中行的內部計數,因爲併發事務可能同時「看到」不同數量的行。爲了處理SELECT語句(*)FROM t語句,InnoDB會掃描表的索引,如果索引不完全在緩衝池中,需要一些時間。爲了快速計數,您必須使用自己創建的計數器表,並讓應用程序根據插入操作對其進行更新並將其刪除。如果大致的行數足夠,可以使用SHOW TABLE STATUS。請參見第9.5節「優化InnoDB表」。

因此,當(慢)第一個查詢後,您的索引完全位於緩衝池中時,第二個查詢會再次快速。

MyISAM不需要關心併發事務可能產生的問題,因爲它不支持事務,因此select count(*) from t只會查找並快速返回存儲值。

+0

是的,這解釋了它。謝謝。 – vy32

相關問題