3 回答

TA貢獻1859條經驗 獲得超6個贊
當您COUNT(*)使用count列索引時,它將是最好的結果。使用MyISAM引擎的Mysql 實際上存儲行數,每次嘗試對所有行進行計數時,它都不會對所有行進行計數。(基于主鍵的列)
使用PHP計數行不是很聰明,因為您必須將數據從mysql發送到php。當您可以在mysql端實現相同的目的時,為什么要這樣做呢?
如果COUNT(*)速度較慢,則應EXPLAIN在查詢上運行,并檢查是否確實使用了索引以及應將索引添加到何處。
以下不是最快的方法,但是在某些情況下,這COUNT(*)并不完全適合-在開始對結果進行分組時,您可能會遇到問題,即COUNT實際上并沒有計算所有行。
解決方法是SQL_CALC_FOUND_ROWS。通常在選擇行但仍需要知道總行數(例如,用于分頁)時使用。選擇數據行時,只需SQL_CALC_FOUND_ROWS在SELECT之后附加關鍵字:
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
選擇所需的行后,可以通過以下單個查詢獲取計數:
SELECT FOUND_ROWS();
FOUND_ROWS() 必須在數據選擇查詢后立即調用。
總之,實際上,一切都取決于您有多少個條目以及WHERE語句中的內容。當有很多行(數萬,數百萬甚至更多)時,您應該真正注意索引的使用方式。

TA貢獻2037條經驗 獲得超6個贊
與我的隊友交談后,里卡多告訴我們更快的方法是:
show table status like '<TABLE NAME>' \G
但是您必須記住,結果可能并不準確。
您也可以從命令行使用它:
$ mysqlshow --status <DATABASE> <TABLE NAME>
更多信息:http : //dev.mysql.com/doc/refman/5.7/en/show-table-status.html
您可以在mysqlperformanceblog上找到完整的討論

TA貢獻1842條經驗 獲得超21個贊
此查詢(與bayuah發布的內容類似)顯示了數據庫中所有表計數的不錯摘要:(我強烈建議Ivan Cachicatari簡化存儲過程的版本)。
SELECT TABLE_NAME AS 'Table Name', TABLE_ROWS AS 'Rows' FROM information_schema.TABLES WHERE TABLES.TABLE_SCHEMA = '`YOURDBNAME`' AND TABLES.TABLE_TYPE = 'BASE TABLE';
例:
+-----------------+---------+
| Table Name | Rows |
+-----------------+---------+
| some_table | 10278 |
| other_table | 995 |
添加回答
舉報