2011-03-10 75 views
7

什麼是這個MySQL查詢MySQL - 複雜性:SELECT COUNT(*)FROM MyTable;

SELECT COUNT(*) FROM MyTable; 

的複雜性條目數的地方存儲和更新每次行插入或刪除時間的表的計數?如果是這樣的話,那麼複雜度應該是O(1)。

+0

看起來在'WHERE'聲明中,'O(N)'必須是'O(N)',因此請仔細評估。 – crush 2014-10-09 14:40:13

回答

8

這取決於存儲引擎。

  • 對於MyISAM,每個表存儲總行數,所以SELECT COUNT(*) FROM yourtable是一個操作O(1)。它只需要讀取這個值。
  • 對於InnoDB,未存儲總行數,因此需要進行全面掃描。這是一個O(n)操作。

manual

InnoDB不留行的內部計數在表中。 (實際上,由於多版本化,這會有些複雜。)要處理SELECT COUNT(*) FROM t語句,InnoDB必須掃描表的索引,如果索引不完全位於緩衝池中,則需要一些時間。如果你的表不經常改變,使用MySQL查詢緩存是一個很好的解決方案。爲了快速計數,您必須使用自己創建的計數器表,並讓應用程序根據插入操作對其進行更新並將其刪除。如果近似行數足夠,也可以使用SHOW TABLE STATUS。參見第13.2.13.1節「InnoDB Performance Tuning Tips」。

+0

我有問題。如果說複雜性,我們是指磁盤讀取的次數,它是否仍然是'O(n)'來掃描表的索引?它不取決於索引類型嗎? – 2011-03-10 11:43:25

1

AFAIK in MyISAM rows-count緩存,不在InnoDB中,每次計數都計算所有行。

-3

我不確定該值是否存儲,但這對您的查詢並不重要。 在你的查詢中使用MySQL,它會在你執行它的那一刻計算所有返回的行。

+2

重要與否,這是他的決定,不是嗎?這對我來說似乎是一個完全正確的問題。 – 2011-03-10 11:54:03

+0

知道函數的複雜性非常重要,特別是避免在有大量數據時執行更加智能的查詢。 – 2017-01-19 01:24:20

相關問題