2011-02-25 53 views
8

我有一個使用innodb的表。我知道桌子大約有8900萬行。使用MySQL獲取innodb表中的行數

SELECT COUNT(*) FROM table; 

需要大約五分鐘才能運行。我知道innodb沒有針對無條件的COUNT(*)查詢進行優化。我怎樣才能重組查詢,讓我更快計數?只需要添加WHERE 1 = 1工作,還是需要查詢特定字段?

我知道我可以使用SHOW TABLE STATUS獲得大致的行數,但我想要在PHP腳本中獲取值,並且似乎有很多需要深入研究的方法。

+2

另請參閱:http://www.tocker.ca/2013/05/02/fastest-way-to-count-rows-in-a-table.html – 2014-06-25 02:51:07

回答

17

如果你是估計數確定,只是不想惹從PHP運行SHOW TABLE STATUS,您可以使用INFORMATION_SCHEMA DB:

SELECT TABLE_ROWS FROM information_schema.tables 
WHERE TABLE_SCHEMA = 'my_db_name' 
AND TABLE_NAME = 'my_table_name'; 
+0

我很好奇這是如何「估計」。有人能提供給我更多關於這方面的信息嗎?爲什麼這個數字不完全準確?謝謝。 – 2013-07-10 17:10:16

+2

@MMiller - 您可以在這裏閱讀所有內容:http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html – Galz 2013-07-12 15:29:35

+0

+1非常適合我們需要的時候不使用'WHERE'。如果你使用'WHERE',也許'SELECT count(1)'是最好的插座(我不知道這是否顯示所有行的緩衝區)。 – 2014-01-02 20:22:12

-5

mysql_num_rows可能對您有用。

+3

這不僅僅是給出行數一個緩衝結果集?我正在查找整個表中的行數。 – Wige 2011-02-25 16:56:20

3

如果表經常讀取並且不經常更新,您可能需要考慮創建一個統計表,在更改表時通過triggers進行更新。

6

如果您確定了大致的記錄數,您可以使用「explain」的輸出。

簡化代碼的優化版本是

$result = mysql_query('explain SELECT count(*) from TABLE_NAME'); 
$row = mysql_fetch_assoc($result); 
echo $row['rows'];