亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySQL:計算行數的最快方法

MySQL:計算行數的最快方法

楊魅力 2019-11-12 10:11:28
在MySQL中,哪種方式計算行數應該更快?這個:SELECT COUNT(*) FROM ... WHERE ...或者,替代方案:SELECT 1 FROM ... WHERE ...// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()有人會認為第一種方法應該更快,因為在內部確定類似情況時,這顯然是數據庫領域,而數據庫引擎應該比其他任何人都要快。
查看完整描述

3 回答

?
慕絲7291255

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語句中的內容。當有很多行(數萬,數百萬甚至更多)時,您應該真正注意索引的使用方式。


查看完整回答
反對 回復 2019-11-12
?
阿晨1998

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上找到完整的討論


查看完整回答
反對 回復 2019-11-12
?
茅侃侃

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 |


查看完整回答
反對 回復 2019-11-12
  • 3 回答
  • 0 關注
  • 1511 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號