2010-10-12 86 views
2

在一個有500萬行的表中,一個SELECT count(*) FROM table將在MyISAM中即時生效,但在InnoDB中需要幾秒鐘。InnoDB爲什麼要對COUNT(*)進行全面掃描?

這是爲什麼呢?爲什麼他們不像MyISAM那樣在InnoDB中優化計數?

謝謝。

+1

:SELECT COUNT(*)FROM [an index] – arthurprs 2010-10-12 22:25:08

回答

6

這是實施的差異。 InnoDB支持事務,因此它必須根據表的事務一致視圖對行進行計數。由於MyISAM不支持ACID屬性,因此如果插入一行,它將被插入給每個人,因此它可以更新它在存儲引擎中保留的計數。

+1

+1向下滾動並閱讀Ken Jacob的帖子(5)http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ – 2010-10-12 22:17:06

6

MyIsam的行數存儲在某個地方,因此查詢幾乎是即時的,InnoDB必須掃描表以獲得完整的計數。 如果你有一個條件計數(如:「SELECT COUNT(*)如果客戶= 4」)都必須做掃描,並沒有太大的差別在這種情況下

來源:

http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

改爲:
+0

+ 1:良好的支持鏈接! – 2010-10-12 22:16:49

相關問題