校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 淺談MySQL 統計行數的 count

淺談MySQL 統計行數的 count

熱門標簽:臨沂做地圖標注 石家莊400電話辦理公司 申請400電話電話價格 新鄉智能外呼系統好處 宜賓全自動外呼系統廠家 許昌外呼增值業務線路 地圖標注客戶付款 廣東400企業電話申請流程 咸陽防封電銷卡

MySQL count() 函數我們并不陌生,用來統計每張表的行數。但如果你的表越來越大,且是 InnoDB 引擎的話,會發現計算的速度會越來越慢。在這篇文章里,會先介紹 count() 實現的原理及原因,然后是 count 不同用法的性能分析,最后給出需要頻繁改變并需要統計表行數的解決方案。

Count() 的實現

InnoDB 和 MyISAM 是 MySQL 常用的數據引擎,由于兩者實現的不同,導致 count() 操作計算的效率也不同。

對于 MyISAM 來說,它把每個表的總行數都存在了磁盤上,因此使用 count(*) 計算時,效率很高直接返回結果。但如果加入了 where 條件,依然會進行搜索,所以效率是不高的。

對于 InnoDB 來說,在進行 count(*) 運算時,會把數據從引擎中一行行讀出來,然后累計計數,自然表大了之后,效率就變低了。

那么,為什么 InnoDB 不能像 MyISAM 在表中記錄呢?原因就在于 InnoDB 比 MyISAM 多了支持事務的特性,同時也需要一定的取舍。由于 MVCC 的控制,使得 MySQL 具有并發的能力,也就是說對于同一時刻,InnoDB 返回的表的行數是不一定的,事務看到的行數與開啟后的一致性視圖有關,換句話說,每個事務能看到的數據版本是不一樣的,只能一行行拿出來進行判斷。

像下面的事務,假設表 t 有 10000 條數據:

Session A Session B Session C
select count(*) from t;
insert into t ();
begin;
insert into t();
select count(*) from t; select count(*) from t; select count(*) from t;
10000; 結果是 10002 結果是 10001

對于 Session A 來說,Session B 未提交不可見,Session C 提交了,但是在 Session A 啟動后提交的,也不可見。所以是 10000.

而對于 Session B 而言,Session C 在啟動之前提交,自己又插入了一條,所以結果是 10002.

其實 InnoDB 在進行 count(*) 操作時,還是做了優化的,在進行 count(*) 操作時,由于普通索引會保存主鍵的 id 值,所以會找到最小的那顆普通索引樹進行查找,而不是去遍歷主鍵索引樹。

在保證邏輯正確的前提下,減少掃描的數據量,是數據庫系統設計的通用法則。

另外在使用 show table status 時,也可以查詢出行數,而且速度很快,但需要注意的是,該命令是通過索引統計的值來采樣估算的。官方文檔說誤差可以有 40%-50%.

但如果我們真的需要實時的獲取的某個表的行數,應該怎么辦呢?

手動保存表的數量

用緩存系統來保存計數

對于進行更新的表,可能會想到用緩存系統來支持。比如 Redis 里來保存某個表總行數。

每次插入數據庫時,Redis 計數加一,相反則減一,這樣看起來讀寫操作都很快,但會存在一些問題。

緩存系統會丟失更新:

對于 Redis 在內存中的數據,需要定期的同步到磁盤中,但對于 Redis 異常重啟,就沒有辦法了。比如在 Redis 中插入后,Redis 重啟,數據沒有持久化到硬盤。這時可以在重啟 Redis 后,從數據庫執行下 count(*) 操作,然后更新到 Redis 中。一次全表掃描還是可行的。

邏輯不精確:

假設一個頁面中,需要顯示一張表的行數,以及每一條數據。在實現時,可以先從 Redis 取數量,然后從數據庫里取記錄。

但可能會出現這樣的情況:

  1. 數據庫查到 100 行結果里有最新插入的記錄,而 Redis 計數里少 1.
  2. 數據庫查到 100 行結果沒有最新的記錄,但 Redis 計數卻多了 1.
Session A Session B
插入一條數據; T1
讀 Redis 計數; T2
從數據庫中查記錄;
Redis 計數加 1; T3

對于 Session B 來說,在 T2 時刻,會發現 Redis 的數量比數據庫少 1 條。

Session A Session B
Redis 計數加 1; T1
讀 Redis 計數; T2
從數據庫中查記錄;
插入一條數據; T3

對于 Session B 來說,在 T2 時刻,會發現 Redis 的數量比數據庫多 1 條。

其實產生問題的原因就是因為 Redis 和數據庫查記錄沒有在同一個事務中。

用數據庫保存

由于 InnoDB 引擎的支持,MySQL 本身是支持事務的,所以將 Redis 的插入操作換成在數據庫的更新操作,就可以利用在RR級別下的事務特性,進而保證數據的精確性。

而且還有一點,由于 redo log 的支持,在 MySQL 發生異常時,是可以保證 crash-safe。

不同 count 用法的執行效率

count() 本身是一個聚合函數,對于返回的結果集,一行行地判斷。如果參數不是 NULL 的話,會一直累加,最后返回結果。

所以 count(*), count(id), count(1) 表示都是返回滿足條件的結果集總行數。

而 count(字段),則表示滿足條件的數據行里,不為 NULL 的字段。

對于 count(id) 來說,InnoDB 會遍歷整張表,把每行 id 取出來,給 server 層。Server 判斷 id 是否為空,然后累加。

對于 count(1) 來說,InnoDB 會遍歷整張表,但不取值。Server 層會自己放入 1,然后累加。

所以對于 count(1) 的執行會比 count(*) 要快,少了解析數據行以及拷貝字段值的操作。

對于 count(字段) 來說,如果字段定義時是 not null, 會一行行讀出,并判斷不能為 null,然后累加。如果定義時可以為 null,執行時,需要將值去除,判斷不是 null 才累加。

count(*) 除外,專門做了優化,不取值,直接按行累加,并且會找到最小的索引樹進行計算。

總結

MySQL count() 函數的執行效率和底層的數據引擎有關。MyISAM 不加 where 條件,查詢會很快,但不支持事務。InnoDB 支持事務,由于 MVCC 的實現,導致每次查詢都需要一行行的掃描,效率不高。

解決方法可以通過設計外部緩存如 Redis,保存記錄。但存在異常重啟和數據不準確的情況。可以通過在 InnoDB 中新建一張表,保存記錄這樣的解決方案。

最后,InnoDB 對 count(*) 做了獨立的優化,而其他的 count 操作,則需要額外的操作。

以上就是淺談MySQL 統計行數的 count的詳細內容,更多關于Mysql count的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • MySQL 大表的count()優化實現
  • MySQL中聚合函數count的使用和性能優化技巧
  • 關于mysql中innodb的count優化問題分享
  • 聊聊MySQL的COUNT(*)的性能
  • 詳解 MySQL中count函數的正確使用方法
  • mysql count提高方法總結
  • MySQL中無過濾條件的count詳解
  • MySQL中count(*)、count(1)和count(col)的區別匯總
  • mySQL count多個表的數據實例詳解
  • MySQL COUNT函數的使用與優化

標簽:北京 鷹潭 合肥 日照 臺灣 阜新 鎮江 貴州

巨人網絡通訊聲明:本文標題《淺談MySQL 統計行數的 count》,本文關鍵詞  淺談,MySQL,統計,行數,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談MySQL 統計行數的 count》相關的同類信息!
  • 本頁收集關于淺談MySQL 統計行數的 count的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91精品国产福利| 日本不卡免费在线视频| 99国产精品99久久久久久| 一色屋精品亚洲香蕉网站| 日本国产一区二区| 久久综合综合久久综合| 国产午夜精品久久| 在线看不卡av| 成人小视频免费观看| 亚洲与欧洲av电影| 国产丝袜美腿一区二区三区| 色综合久久88色综合天天6| 丝袜诱惑亚洲看片| 国产精品二三区| 日韩精品一区二区三区中文精品| 国产成人在线免费观看| 午夜精品久久久久影视| 国产精品免费久久久久| 69久久夜色精品国产69蝌蚪网| 成人av网站免费| 丰满岳乱妇一区二区三区| 麻豆精品视频在线| 日韩中文字幕一区二区三区| 亚洲同性同志一二三专区| 一区二区在线观看视频在线观看| 精品福利一区二区三区| 91精品国产综合久久香蕉麻豆| 91小视频免费观看| 99久久精品99国产精品| 91在线观看下载| 99久久精品国产观看| 成人av网站在线观看| jizzjizzjizz欧美| 一本色道久久综合狠狠躁的推荐| 懂色av中文字幕一区二区三区| 成人美女视频在线看| 91麻豆国产精品久久| 欧美综合亚洲图片综合区| 欧美二区三区的天堂| 日韩欧美国产不卡| 欧美韩国一区二区| 一区二区三区在线免费视频| 亚洲第一久久影院| 奇米精品一区二区三区在线观看 | 玉米视频成人免费看| 亚洲一区二区三区三| 蜜臀av性久久久久蜜臀av麻豆| 国产一区免费电影| 欧美亚洲综合在线| 久久综合色综合88| 亚洲高清一区二区三区| 国产1区2区3区精品美女| 在线观看91视频| 亚洲欧美激情小说另类| 青青草成人在线观看| 国产乱码精品一区二区三| 欧美三级乱人伦电影| 国产精品国产三级国产普通话99 | 日韩伦理av电影| 国产精品一线二线三线| 正在播放一区二区| 亚洲欧美影音先锋| 成人免费看视频| 久久久亚洲欧洲日产国码αv| 亚洲成人手机在线| 在线视频你懂得一区二区三区| 国产欧美日韩精品在线| 九九国产精品视频| 精品日韩在线一区| 日本成人中文字幕在线视频 | 波多野结衣欧美| 国产精品色噜噜| 国产精品一区二区无线| 久久网站最新地址| 成人综合婷婷国产精品久久蜜臀 | 日本韩国一区二区三区| 91国内精品野花午夜精品| 亚洲男同1069视频| 久久99精品久久久久久久久久久久| 懂色av一区二区三区免费观看| 欧美精品一区二区不卡| 国产一区二区精品在线观看| 欧美喷潮久久久xxxxx| 日韩理论片在线| 色综合天天综合狠狠| 中文字幕亚洲不卡| av一二三不卡影片| 亚洲第一电影网| 懂色av中文字幕一区二区三区 | 亚洲视频 欧洲视频| 国产一区二区电影| 欧美一区二视频| 国产黄色成人av| 久久久不卡网国产精品二区| 亚洲一区二区高清| 日韩丝袜情趣美女图片| 午夜精品视频一区| 欧美欧美午夜aⅴ在线观看| 中文字幕一区二区三区在线不卡 | 972aa.com艺术欧美| 欧美一区二区三区视频免费播放| 国产午夜精品久久| 三级久久三级久久| 欧美精品v日韩精品v韩国精品v| 欧美韩日一区二区三区| 麻豆精品一区二区三区| 久久这里只有精品6| 国产一区二区三区电影在线观看 | 91电影在线观看| 亚洲国产精品久久久久秋霞影院 | 欧美日韩激情一区二区| 日韩午夜在线影院| 亚洲国产一区二区视频| 欧美性高清videossexo| 日本在线播放一区二区三区| 亚洲女同ⅹxx女同tv| 久久精品夜色噜噜亚洲a∨| 日本视频在线一区| 蜜桃在线一区二区三区| 成人性生交大片| 日韩欧美国产高清| 亚洲国产aⅴ成人精品无吗| 国产精品欧美久久久久一区二区| 国产免费观看久久| 一区二区日韩av| 蜜桃一区二区三区四区| 亚洲国产精品一区二区www | 一区二区三区**美女毛片| 亚洲激情成人在线| 日韩电影在线观看网站| 国产盗摄一区二区| 欧美亚一区二区| 国产精品午夜免费| 麻豆精品蜜桃视频网站| 91在线视频免费观看| 久久众筹精品私拍模特| 亚洲一区二区三区美女| 成人欧美一区二区三区白人| 日本一区二区三区四区在线视频| 欧美大片免费久久精品三p| 91国产免费看| 色婷婷久久一区二区三区麻豆| 国产99一区视频免费| 成人网页在线观看| 亚洲妇熟xx妇色黄| 韩国女主播一区| 欧美无人高清视频在线观看| 欧美激情在线观看视频免费| 日韩电影在线观看电影| 成人av资源下载| 久久综合中文字幕| 亚洲成人黄色影院| 欧美视频中文字幕| 中文字幕一区日韩精品欧美| 蜜芽一区二区三区| 在线不卡一区二区| 亚洲成人自拍偷拍| 91麻豆文化传媒在线观看| 精品日韩一区二区三区| 国产一区二区三区高清播放| 日韩一区二区三区免费看| 亚洲国产三级在线| 一本色道久久综合亚洲91| 亚洲蜜臀av乱码久久精品| 成人av第一页| 国产精品美女一区二区在线观看| 五月天丁香久久| 精品国产精品一区二区夜夜嗨| 看电视剧不卡顿的网站| 国产校园另类小说区| 成人av综合在线| 三级成人在线视频| 2021久久国产精品不只是精品| 精品一区在线看| 久久品道一品道久久精品| 91色九色蝌蚪| 久久99久久久久| 亚洲欧美日韩中文播放 | 成人av在线电影| 日韩精品高清不卡| 精品国产乱码久久久久久影片| 国产呦萝稀缺另类资源| 亚洲精品v日韩精品| 久久久噜噜噜久久中文字幕色伊伊 | 久久精品999| 亚洲综合久久av| 国产亚洲1区2区3区| 911精品产国品一二三产区| jizzjizzjizz欧美| 国产九色精品成人porny| 亚洲精品国产无套在线观| 欧美精品一区二区在线观看| 在线免费观看日本一区| 高清国产午夜精品久久久久久| 日韩久久一区二区| 国产精品网站导航| 日韩丝袜情趣美女图片| 欧美日韩国产在线播放网站| 色成年激情久久综合| 日本大香伊一区二区三区|