99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

MySQL的count(*)怎么實現

這篇文章主要介紹“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條件沒有任何索引,萬萬萬不推薦!
那對于統計類的業務,推薦的幾種做法:
1)帶自增id的,可以用最大id來近似獲取
2)自己計數

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() 是一個聚合函數,對于返回的結果集,一行行地判斷,如果 count 函數的參數不是 NULL,累計值就加 1,否則不加。  最后返回累計值。
1)count(主鍵id)
InnoDB 引擎會遍歷整張表,把每一行的 id 值都取出來,返回給 server 層。  server 層拿到 id 后,判斷是不可能為空的,就按行累加。
2)count(1)
InnoDB 引擎遍歷整張表,但不取值。  server 層對于返回的每一行,放一個數字“1”進去,判斷是不可能為空的,按行累加。
3) count(字段)
如果這個“字段”是定義為 not null 的話,一行行地從記錄里面讀出這個字段,判斷不能為 null,按行累加;
如果這個“字段”定義允許為 null,那么執行的時候,判斷到有可能是 null,還要把值取出來再判斷一下,不是 null 才累加。
4)count(*)
并不會把全部字段取出來,而是專門做了優化,不取值。  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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設