在一個有500萬行的表中,一個SELECT count(*) FROM table
將在MyISAM中即時生效,但在InnoDB中需要幾秒鐘。InnoDB爲什麼要對COUNT(*)進行全面掃描?
這是爲什麼呢?爲什麼他們不像MyISAM那樣在InnoDB中優化計數?
謝謝。
在一個有500萬行的表中,一個SELECT count(*) FROM table
將在MyISAM中即時生效,但在InnoDB中需要幾秒鐘。InnoDB爲什麼要對COUNT(*)進行全面掃描?
這是爲什麼呢?爲什麼他們不像MyISAM那樣在InnoDB中優化計數?
謝謝。
這是實施的差異。 InnoDB支持事務,因此它必須根據表的事務一致視圖對行進行計數。由於MyISAM不支持ACID屬性,因此如果插入一行,它將被插入給每個人,因此它可以更新它在存儲引擎中保留的計數。
+1向下滾動並閱讀Ken Jacob的帖子(5)http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ – 2010-10-12 22:17:06
MyIsam的行數存儲在某個地方,因此查詢幾乎是即時的,InnoDB必須掃描表以獲得完整的計數。 如果你有一個條件計數(如:「SELECT COUNT(*)如果客戶= 4」)都必須做掃描,並沒有太大的差別在這種情況下
來源:
http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/
改爲:+ 1:良好的支持鏈接! – 2010-10-12 22:16:49
:SELECT COUNT(*)FROM [an index] – arthurprs 2010-10-12 22:25:08