MySQL InnoDB引擎的count處理及count(*)和count(1)區別

不討論 MyISAM 引擎,countMyISAMInnoDB 引擎下的區別是基礎的區別。html

文檔地址:https://dev.mysql.com/doc/ref...mysql

圖片描述

翻譯:
InnoDB 引擎並不在一個表中保存行內計數,由於併發事務會在相同時間看到不一樣的行數。所以, SELECT COUNT(*) 語句只計算當前事務可見的行數。sql

MySQL 5.7.18 版本以前, InnoDB 引擎經過掃描聚簇索引來處理 SELECT COUNT(*) 語句,在 MySQL 5.7.18 版本中,若是存在一個更小的二級索引, InnoDB 會橫向讀取這個來執行 SELECT COUNT(*) 語句。併發

若是索引記錄不徹底在緩衝池中,則處理選擇 SELECT(*) 語句須要一些時間。爲了更快的計數,您能夠建立一個計數器表,並讓您的應用程序按插入和刪除操做更新它。然而,這種方法在同一計數器表中啓動成千上萬個併發事務的狀況下,可能沒法很好地擴展。若是近似行計數足夠,則可使用 SHOW TABLE STATUS 語句。
InnoDB 引擎以一樣的方式處理 SELECT COUNT(*)COUNT(1),二者沒有性能差別。性能

翻譯自官方文檔,確定權威spa

相關文章
相關標籤/搜索