2009-12-06 45 views
9

對於InnoDB存儲是它更好地MySQL的count行性能

  • 使用mysql_num_rows

    select * from tbl where pk = 1 
    

來計算記錄的總數或

  • 獲取數組和ret rieve從

    select count(*) as total from tbl where pk = 1 
    

「總」 的價值?

回答

13

絕對是後者。它可以直接從PK的索引中獲取價值,而前者幾乎肯定需要表掃描(除非每一列都是索引的一部分;即使如此,它也必須從所有索引中獲取值)。然後根據你如何連接到數據庫,有大量的數據傳輸只是爲了計算。

explain可以幫到這裏。在這種情況下,它會告訴你選擇已被優化。

1

後者最有可能表現更好,因爲您只傳輸單個整數,而在第一種情況下,您將發送更多數據。

+1

MySQL實際上並沒有傳輸數據之前調用'mysql_fetch_array' – Andomar

+0

所以在那種情況下,爲什麼不是第一個一個更好? – Wolfgang

+0

MySQL將仍然以某種方式緩存查詢結果,直到完全獲取數據。 –

4

除了Zxpro的答案,還有MySQL的內部工作:

select * from tbl where pk = 1 

強制MySQL檢索物理匹配的行;而

select count(*) as total from tbl where pk = 1 

允許MySQL來計算的主鍵條目,而不檢索任何錶行

1

如果「PK」是主鍵,只能有一個記錄,所以答案將是無論是0還是1,因此無論如何你都不需要數它們。

但是,後者。

InnoDB不需要檢查索引,它還需要檢查該行對當前事務是否可見,因爲MVCC。但這是一個細節。它會使用一個覆蓋索引無論如何(這是不相關的,如果PK是主鍵,因爲它總是聚集)