這篇文章主要介紹“MySQL的count(*)怎么實現”,在日常操作中,相信很多人在MySQL的count(*)怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL的count(*)怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在成都網站建設、網站制作中從網站色彩、結構布局、欄目設置、關鍵詞群組等細微處著手,突出企業的產品/服務/品牌,幫助企業鎖定精準用戶,提高在線咨詢和轉化,使成都網站營銷成為有效果、有回報的無錫營銷推廣。成都創新互聯專業成都網站建設10年了,客戶滿意度97.8%,歡迎成都創新互聯客戶聯系。
1. 背景
自從大家對于MySQL數據庫的穩定性有了更高的追求后,經常有小伙伴有這樣的疑問,對于count(*)這樣的操作,有沒有正確的姿勢,或者有沒有可以優化的地方?
但答案比較殘酷,如果已經使用了正確的索引,那么基本上沒有可以優化的地方。一旦出現慢查詢了,它就是慢查詢了,要改,只能自己計數或者通過其他搜索平臺來做。
今天,就一起來看看為什么會這樣,并對大家日常會遇到的一些的困惑進行解答。
2. count(*)的實現方式
據說,MyISAM 引擎把一個表的總行數存在了磁盤上,因此執行 count(*) 的時候會直接返回這個數,效率很高。而我們的mysql一般都是用Innodb的引擎,Innodb是怎么實現count操作的呢?InnoDB 引擎就比較麻煩了,它執行 count(*) 的時候,需要把數據一行一行地從引擎里面讀出來,然后累積計數。所以,當我們的表里面的記錄越來越多的時候,count(*)就會越來越慢。當然,我們這里說的都是不帶where條件的,如果帶上where條件的話,MyISAM也是很慢的。
3.正確的打開方式
嗯,首先還是說,mysql上不太推薦用count(*)來做統計相關業務,尤其是表非常大的情況下。那如果業務比較小,需要快速上馬,那么,至少應該保證count(*)帶上了科學的where條件,然后,這個表也已經建立了科學的索引。1)如果count(*)帶上的where條件,而且能夠走覆蓋索引,那還是可以偶爾走一走的。2)如果count(*)帶上的where條件,能夠走索引,但是需要回表,那么這種就會比較危險,尤其是隨著表規模的擴大,終究是一顆雷。3)如果純粹count(*),或者where條件沒有任何索引,萬萬萬不推薦!3)其他數據分析平臺進行聚合
4. 能否用表統計信息代替count(*)
有同學在日常使用過程中,問能否使用 系統表的統計信息 來代替count。答案是不行。這里的tableRows只是一個參考值。
這里的表統計信息,實際上是使用show table status獲取的。
這個值是如何得到的呢?
我們需要了解下mysql的采樣統計方法。為什么要采樣統計呢?
因為把整張表取出來一行行統計,雖然可以得到精確的結果,但是代價太高了,所以只能選擇“采樣統計”
(所以其實mysql自己也沒有count(*)的好方法)。采樣統計的時候,InnoDB 默認會選擇 N 個數據頁,統計這些頁面上的不同值,得到一個平均值,然后乘以這個索引的頁面數,就得到了這個索引的基數。而數據表是會持續更新的,索引統計信息也不會固定不變。
所以,當變更的數據行數超過 1/M 的時候,會自動觸發重新做一次索引統計。因此,這個采樣估算得來的值,是很不準的。有多不準呢,官方文檔說誤差可能達到 40% 到 50%。
4.關于那些奇奇怪怪的count(?)
在看一些老代碼查詢的時候,我們經常會看到count(1),count(id),count(字段)等方式,那它們糾結孰優孰劣,到底有沒有性能上的差異呢?
count() 是一個聚合函數,對于返回的結果集,一行行地判斷,如果 count 函數的參數不是 NULL,累計值就加 1,否則不加。
最后返回累計值。InnoDB 引擎會遍歷整張表,把每一行的 id 值都取出來,返回給 server 層。
server 層拿到 id 后,判斷是不可能為空的,就按行累加。InnoDB 引擎遍歷整張表,但不取值。
server 層對于返回的每一行,放一個數字“1”進去,判斷是不可能為空的,按行累加。如果這個“字段”是定義為 not null 的話,一行行地從記錄里面讀出這個字段,判斷不能為 null,按行累加;如果這個“字段”定義允許為 null,那么執行的時候,判斷到有可能是 null,還要把值取出來再判斷一下,不是 null 才累加。并不會把全部字段取出來,而是專門做了優化,不取值。
count(*) 肯定不是 null,按行累加。所以結論是:
按照效率排序的話,count(字段)<count(主鍵 id)<count(1)≈count(*),所以我建議,盡量使用 count(*)。到此,關于“MySQL的count(*)怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!
分享名稱:MySQL的count(*)怎么實現
路徑分享:http://www.yijiale78.com/article36/gdcopg.html
成都網站建設公司_創新互聯,為您提供企業網站制作、手機網站建設、軟件開發、、網站改版、建站公司
廣告
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源:
創新互聯