我有一個使用innodb的表。我知道桌子大約有8900萬行。使用MySQL獲取innodb表中的行數
SELECT COUNT(*) FROM table;
需要大約五分鐘才能運行。我知道innodb沒有針對無條件的COUNT(*)查詢進行優化。我怎樣才能重組查詢,讓我更快計數?只需要添加WHERE 1 = 1工作,還是需要查詢特定字段?
我知道我可以使用SHOW TABLE STATUS獲得大致的行數,但我想要在PHP腳本中獲取值,並且似乎有很多需要深入研究的方法。
我有一個使用innodb的表。我知道桌子大約有8900萬行。使用MySQL獲取innodb表中的行數
SELECT COUNT(*) FROM table;
需要大約五分鐘才能運行。我知道innodb沒有針對無條件的COUNT(*)查詢進行優化。我怎樣才能重組查詢,讓我更快計數?只需要添加WHERE 1 = 1工作,還是需要查詢特定字段?
我知道我可以使用SHOW TABLE STATUS獲得大致的行數,但我想要在PHP腳本中獲取值,並且似乎有很多需要深入研究的方法。
如果你是估計數確定,只是不想惹從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';
我很好奇這是如何「估計」。有人能提供給我更多關於這方面的信息嗎?爲什麼這個數字不完全準確?謝謝。 – 2013-07-10 17:10:16
@MMiller - 您可以在這裏閱讀所有內容:http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html – Galz 2013-07-12 15:29:35
+1非常適合我們需要的時候不使用'WHERE'。如果你使用'WHERE',也許'SELECT count(1)'是最好的插座(我不知道這是否顯示所有行的緩衝區)。 – 2014-01-02 20:22:12
如果表經常讀取並且不經常更新,您可能需要考慮創建一個統計表,在更改表時通過triggers進行更新。
如果您確定了大致的記錄數,您可以使用「explain
」的輸出。
簡化代碼的優化版本是
$result = mysql_query('explain SELECT count(*) from TABLE_NAME');
$row = mysql_fetch_assoc($result);
echo $row['rows'];
另請參閱:http://www.tocker.ca/2013/05/02/fastest-way-to-count-rows-in-a-table.html – 2014-06-25 02:51:07