3 回答

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

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

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
此查詢(與bayuah發(fā)布的內(nèi)容類似)顯示了數(shù)據(jù)庫中所有表計(jì)數(shù)的不錯(cuò)摘要:(我強(qiáng)烈建議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 |
添加回答
舉報(bào)