MySQL count(*),count(1),count(field)區別、性能差異及優化建議

2020-12-12 偏執的IT工匠

MySQL count函數是用來獲取表中滿足一定條件的記錄數,常見用法有三種,count(*),count(1),count(field),這三種有什麼區別?在性能上有何差異?本文將通過測試案例詳細介紹和分析。

原文地址:mytecdb.com/blogDetail.php?id=81

三者有何區別:

count(field)不包含欄位值為NULL的記錄。count(*)包含NULL記錄。select(*)與select(1) 在InnoDB中性能沒有任何區別,處理方式相同。官方文檔描述如下: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

1. 性能對比

通過案例來測試一下count(*),count(1),count(field)的性能差異,MySQL版本為5.7.19,測試表是一張sysbench生成的表,表名sbtest1,總記錄數2411645,如下:

測試SQL語句:

select count(*) from sbtest1;select count(1) from sbtest1;select count(id) from sbtest1;select count(k) from sbtest1;select count(c) from sbtest1;select count(pad) from sbtest1;

針對count(*)、count(1)和count(id),加了強制走主鍵的測試,如下:select count(*) from sbtest1 force index(primary);select count(1) from sbtest1 force index(primary);select count(id) from sbtest1 force index(primary);

另外對不同的測試SQL,收集了profile,發現主要耗時都在Sending data這個階段,記錄Sending data值。

匯總測試結果:

結果分析:

從以上測試結果來看,count(*)和count(1)性能基本一樣,默認走二級索引(k_1),性能最好,這也驗證了count(*)和count(1)在InnoDB內部處理方式一樣。count(id) 雖然也走二級索引(k_1),但是性能明顯低於count(*)和count(1),可能MySQL內部在處理count(*)和count(1)時做了額外的優化。強制走主鍵索引時,性能反而沒有走更小的二級索引好,InnoDB存儲引擎是索引組織表,行數據在主鍵索引的葉子節點上,走主鍵索引掃描時,處理的數據量比二級索引更多,所以性能不及二級索引。count(c)和count(pad)沒有走索引,性能最差,但是明顯count(pad)比count(c)好,因為pad欄位類型為char(60),小於欄位c的char(120),儘管兩者性能墊底,但是欄位小的性能相對更好些。2. count(*)改進

在5.7.18版本之前,InnoDB處理select count(*) 是通過掃描聚簇索引,來獲取總記錄數。從5.7.18版本開始,InnoDB掃描一個最小的可用的二級索引來獲取總記錄數,或者由SQL hint來告訴優化器使用哪個索引。如果二級索引不存在,InnoDB將會掃描聚簇索引。執行select count(*)在大部分場景下性能都不會太好,尤其是表記錄數特別大的情況下,索引數據不在buffer pool裡面,需要頻繁的讀磁碟,性能將更差。

3. count(*)優化思路

一種優化方法,是使用一個統計表來存儲表的記錄總數,在執行DML操作時,同時更新該統計表。這種方法適用於更新較少,讀較多的場景,而對於高並發寫操作,性能有很大影響,因為需要並發更新熱點記錄。如果業務對count數量的精度沒有太大要求,可使用show table status中的行數作為近似值。

相關焦點

  • mysql大表中count()的用法以及mysql中count()的優化
    本篇文章給大家帶來的內容是關於mysql大表中count()的用法以及mysql中count()的優化,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一個單表中包含有6000w+的數據,然而你又不能拆分.需要分別統計表中有多少數據,A產品有多少,B產品有多少這幾個數據.
  • 英語count the cost 的用法
    對,count the cost 就是一個很好的選擇。字表意思也很吻合,數一數成本!今天我們一起通過幾個例句來學習一下這個詞組的用法。例句1:The offer was attractive financially, but when I sat down and counted the cost in terms of separation from my family and friends, I decided the job was not for me.
  • 漫畫10count改編手遊 10count預計今秋來襲
    日本新書館與Arithmetic近日宣布,預定將在iOS/Android雙平臺上推出一款以日本漫畫家「寶井理人」原作BL人氣漫畫《10count》(テンカウント)為題材的戀愛模擬策略新作,推出時間目前預定為2018年秋天。
  • Down for the count? 敗得很慘
    Reader question:Please explain "down for the count", as in "Donald Trump is down for the count."My comments:Oh, a boxing term.
  • mysql 常用命令二
    --databases db1 db2 >db1.db2.sql;#導入資料庫# db1.db2.sql;#複製資料庫# mysqldump --all-databases
  • excel關於函數count和countif的妙用
    excel關於函數count和countif的操作技巧中,我們介紹了函數count和countif的語法形式與基本操作方法,然後通過實例的形式向大家展現了函數count和countif的具體用法,今天的講解內容是昨天內容的進一步拓展與複習。
  • 英語口語:你知道Count on me什麼意思嗎?
    1) 把你學過的英語用起來理解和表達英語Count on me:1.Okay.I got you.When we say:Count (up)on me,or count on something, we mean :Yoy can rely on me,or something.You can depend on me.You can trust me.2.
  • 10 count手遊安卓版官網免費下載
    10 count手遊安卓版官網免費下載介紹 《10 count手遊安卓版官網》講述了一位身患重度潔癖的上班族與一名心理諮詢醫生之間的糾結曲折的戀愛故事。
  • Prysmian提供high fiber count 的FlexRibbon光纖光纜
    [導讀]普睿司曼集團擴展了其FlexRibbon光纖光纜系列,包括1728和3456 fiber count
  • 每日一句英語:Count me in. 算我一個。
    支持範例   1. If the cost of the trip is no more than 1000 yuan, you can count me in.   如果這次旅行的花費不超過一千元,就算我一個。   2. Please count me in this project.   請讓我參加這個項目。
  • 抖音上很火的一首英文歌《Count on Me》,好聽到爆!
    we're made of要知道你是怎樣一個自己When we are called to help our friends in need知道何時能幫到朋友 當他處在水深火熱裡You can count
  • 《10 count》PV公開
    《10 count》是寶井理人創作,連載於漫畫雜誌《Dear+》上的作品,此前本作已經宣布電視動畫化。近日,官方確認電視動畫預定於2020年播出,並公開了先導PV。目前動畫的聲優、STAFF陣容等都尚未公開,騰訊動漫將持續關注。
  • mysql學習詳記六&&關鍵字執行順序&mysql內置函數
    也就是說mysql內部有一定的解析順序,解析順序select優先於having。在這裡我個人認為是mysql可能沒有將這一點做規範。Oracle中having無法使用select語句內的別名。比如有這樣一張表:create table func(id int primary key,count int,birthday date);insert into func values(1,1,'1990-09-09');--插入一條數據
  • 抖音捧臉殺的背景音樂是什麼歌 Count On Me完整歌詞分享
    on me like 1 2 3  你可以依靠我,就像1, 2, 數到3  I』ll be there  我就會出現  And I know when I need it I can count on you like 4 3 2  而我知道我有需要時,我可以依靠你,就像倒數4,3,2  And you』ll be
  • Trucecount推出RFID 2-Go零售庫存管理軟體
    Truecount,一家專注於零售業的軟體公司,發布了一個RFID解決方案——「RFID 2-Go」,讓中小零售商清點庫存更迅速,更準確。  完整的單品級解決方案,為一個輕量級的公文包格式,能快速部署,可移植性好。
  • 這些英語單詞都和count有關係,有些可能在我們的意料之外
    今天,機農就和小夥伴們分享這麼一些和單詞count有關的單詞,並利用count這個單詞將相關的單詞都記住。單詞encounter遇到。單詞中的En是個很特殊的成分,它可以作為前綴,也可以作為後綴,而且無論是放在前綴還是後綴都表示使動詞。比如放在單詞enable表示使能夠,單詞encourage鼓勵,單詞shorten縮短,單詞largen擴大。
  • 寶井理人10count動漫化決定,超好看的動畫化耽美漫盤點!
    前不久和大家說了一個令人振奮的消息,那就是寶井理人大大的《10 count》遊戲化決定,意味著腐女們可以自行決定主人公們結局的走向啦!今天還要和大家說另一個讓人沸騰的消息——寶井理人大大的10 count動漫化決定!
  • 【輕漫畫】2016年度這本BL不得了第一名《10 count》
    《這本BL不得了》獲得漫畫部門第1名的是由寶井理人編繪的BL漫畫《10 count》。得知獲獎的消息後,寶井理人在推特上表示感謝:「感謝大家從這麼多有趣的BL漫畫中為我的《10 count》投票,今後我會繼續努力。」    寶井理人在這之前一直都是畫純情故事的,忽然轉而畫了一個有點艱深的內容,以致於劇情變成了史上最長的前戲,攪得腐女大呼黑瀨不是男人。
  • TV動畫「10 count」2020年播出,PV公開官方網站開放
    TV動畫「10 count」2020年播出,PV公開官方網站開放 新聞 2019-03-24 10:06:33
  • 良心文章|MySQL性能優化分區之實戰(最全面最完整的分區)
    分區類型range分區:基於一個給定的連續區間範圍(區間要求連續並且不能重疊),把數據分配到不同的分區list分區:類似於range分區,區別在於list分區是居於枚舉出的值列表分區,range是基於給定的連續區間範圍分區hash分區:基於給定的分區個數,把數據分配到不同的分區