亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL中無過濾條件的count詳解

2024-07-25 19:09:35
字體:
供稿:網(wǎng)友

count(*)

實(shí)現(xiàn)

1、MyISAM:將表的總行數(shù)存放在磁盤上,針對無過濾條件的查詢可以直接返回

如果有過濾條件的count(*),MyISAM也不能很快返回

2、InnoDB:從存儲引擎一行行地讀出數(shù)據(jù),然后累加計數(shù)

由于MVCC,在同一時刻,InnoDB應(yīng)該返回多少行是不確定

樣例

假設(shè)表t有10000條記錄

 

session A session B session C
BEGIN;    
SELECT COUNT(*) FROM t;(返回10000)    
    INSERT INTO t;(插入一行)
  BEGIN;  
  INSERT INTO t(插入一行);  
SELECT COUNT(*) FROM t;(返回10000) SELECT COUNT(*) FROM t;(返回10002) SELECT COUNT(*) FROM T;(返回10001)

 

最后時刻三個會話同時查詢t的總行數(shù),拿到的結(jié)果卻是不同的

InnoDB默認(rèn)事務(wù)隔離級別是RR,通過MVCC實(shí)現(xiàn)

  • 每個事務(wù)都需要判斷每一行記錄是否對自己可見

優(yōu)化

1、InnoDB是索引組織表

  • 聚簇索引樹:葉子節(jié)點(diǎn)是數(shù)據(jù)
  • 二級索引樹:葉子節(jié)點(diǎn)是主鍵值

2、二級索引樹占用的空間比聚簇索引樹小很多

3、優(yōu)化器會在保證邏輯正確的前提下,遍歷最小的索引樹,盡量減少掃描的數(shù)據(jù)量

  • 針對無過濾條件的count操作,無論遍歷哪一顆索引樹,效果都是一樣的
  • 優(yōu)化器會為count(*)選擇最優(yōu)的索引樹

show table status

mysql> SHOW TABLE STATUS/G;*************************** 1. row *************************** Name: t Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 100256 Avg_row_length: 47 Data_length: 4734976Max_data_length: 0 Index_length: 5275648 Data_free: 0 Auto_increment: NULL Create_time: 2019-02-01 17:49:07 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment:

SHOW TABLE STATUS同樣通過采樣來估算(非常不精確),誤差能到40%~50%

維護(hù)計數(shù)

緩存

方案

  • 用Redis來保存表的總行數(shù)(無過濾條件)
  • 這個表每插入一行,Redis計數(shù)+1,每刪除一行,Redis計數(shù)-1

缺點(diǎn)

丟失更新

1、Redis可能會丟失更新

2、解決方案:Redis異常重啟后,到數(shù)據(jù)庫執(zhí)行一次count(*)

  • 異常重啟并不常見,這時全表掃描的成本是可以接受的

邏輯不精確 – 致命

1、場景:顯示操作記錄的總數(shù)和最近操作的100條記錄

2、Redis和MySQL是兩個不同的存儲系統(tǒng),不支持分布式事務(wù),因此無法拿到精確的一致性視圖

時序A

session B在T3時刻,查到的100行結(jié)果里面有最新插入的記錄,但Redis還沒有+1,邏輯不一致

 

時刻 session A session B
T1    
T2 插入一行數(shù)據(jù)R;  
T3   讀取Redis計數(shù);
查詢最近100條記錄;
T4 Redis計數(shù)+1;

 

時序B

session B在T3時刻,查到的100行結(jié)果里面沒有最新插入的記錄,但Redis已經(jīng)+1,邏輯不一致

 

時刻 session A session B
T1    
T2 Redis計數(shù)+1;  
T3   讀取Redis計數(shù);
查詢最近100條記錄;
T4 插入一行數(shù)據(jù)R;

 

數(shù)據(jù)庫

  • 把計數(shù)值放到數(shù)據(jù)庫單獨(dú)的一張計數(shù)表C中
  • 利用InnoDB的crash-safe的特性,解決了崩潰丟失的問題
  • 利用InnoDB的支持事務(wù)的特性,解決了一致性視圖的問題
  • session B在T3時刻,session A的事務(wù)還未提交,表C的計數(shù)值+1對自己不可見,邏輯一致

 

時刻 session A session B
T1    
T2 BEGIN;
表C中的計數(shù)值+1;
 
T3   BEGIN;
讀表C計數(shù)值;
查詢最新100條記錄;
COMMIT;
T4 插入一行數(shù)據(jù)R;
COMMIT;

 

count的性能

語義

1、count()是一個聚合函數(shù),對于返回的結(jié)果集,一行一行地進(jìn)行判斷

如果count函數(shù)的參數(shù)值不是NULL,累計值+1,否則不加,最后返回累計值

2、count(字段F)

  • 字段F有可能為NULL
  • 表示返回滿足條件的結(jié)果集里字段F不為NULL的總數(shù)

3、count(主鍵ID)、count(1)、count(*)

  • 不可能為NULL
  • 表示返回滿足條件的結(jié)果集的總數(shù)

4、Server層要什么字段,InnoDB引擎就返回什么字段

  • count(*)例外,不返回整行,只返回空行

性能對比

count(字段F)

1、如果字段F定義為不允許為NULL,一行行地從記錄里讀出這個字段,判斷通過后按行累加

  • 通過表結(jié)構(gòu)判斷該字段是不可能為NULL

2、如果字段F定義為允許NULL,一行行地從記錄里讀出這個字段,判斷通過后按行累加

  • 通過表結(jié)構(gòu)判斷該字段是有可能為NULL
  • 判斷該字段值是否實(shí)際為NULL

3、如果字段F上沒有二級索引,只能遍歷整張表(聚簇索引)

4、由于InnoDB必須返回字段F,因此優(yōu)化器能做出的優(yōu)化決策將減少

  • 例如不能選擇最優(yōu)的索引來遍歷

count(主鍵ID)

  • InnoDB會遍歷整張表(聚簇索引),把每一行的id值取出來,返回給Server層
  • Server層拿到id后,判斷為不可能為NULL,然后按行累加
  • 優(yōu)化器可能會選擇最優(yōu)的索引來遍歷

count(1)

  1. InnoDB引擎會遍歷整張表(聚簇索引),但不取值
  2. Server層對于返回的每一行,放一個數(shù)字1進(jìn)去,判斷是不可能為NULL,按行累加
  3. count(1)比count(主鍵ID)快,因?yàn)閏ount(主鍵ID)會涉及到兩部分操作
  • 解析數(shù)據(jù)行
  • 拷貝字段值

count(*)

  1. count(*)不會把所有值都取出來,而是專門做了優(yōu)化,不取值,因?yàn)椤?』肯定不為NULL,按行累加
  2. 不取值:InnoDB返回一個空行,告訴Server層不是NULL,可以計數(shù)

效率排序

  1. count(字段F) < count(主鍵ID) < count(1) ≈ count(*)
  2. 盡量使用count(*)

樣例

mysql> SHOW CREATE TABLE prop_action_batch_reward/G;*************************** 1. row *************************** Table: prop_action_batch_rewardCreate Table: CREATE TABLE `prop_action_batch_reward` ( `id` bigint(20) NOT NULL, `source` int(11) DEFAULT NULL, `serial_id` bigint(20) NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `user_ids` mediumtext, `serial_index` tinyint(4) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `uniq_serial_id_source_index` (`serial_id`,`source`,`serial_index`), KEY `idx_create_time` (`create_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

count(字段F)

無索引

user_ids上無索引,而InnoDB又必須返回user_ids字段,只能遍歷聚簇索引

mysql> EXPLAIN SELECT COUNT(user_ids) FROM prop_action_batch_reward;+----+-------------+--------------------------+------+---------------+------+---------+------+----------+-------+| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+--------------------------+------+---------------+------+---------+------+----------+-------+| 1 | SIMPLE | prop_action_batch_reward | ALL | NULL  | NULL | NULL | NULL | 16435876 | NULL |+----+-------------+--------------------------+------+---------------+------+---------+------+----------+-------+mysql> SELECT COUNT(user_ids) FROM prop_action_batch_reward;+-----------------+| count(user_ids) |+-----------------+| 17689788 |+-----------------+1 row in set (10.93 sec)

有索引

1、serial_id上有索引,可以遍歷uniq_serial_id_source_index

2、但由于InnoDB必須返回serial_id字段,因此不會遍歷邏輯結(jié)果等價的更優(yōu)選擇idx_create_time

  • 如果選擇idx_create_time,并且返回serial_id字段,這意味著必須回表
mysql> EXPLAIN SELECT COUNT(serial_id) FROM prop_action_batch_reward;+----+-------------+--------------------------+-------+---------------+-----------------------------+---------+------+----------+-------------+| id | select_type | table   | type | possible_keys | key    | key_len | ref | rows | Extra |+----+-------------+--------------------------+-------+---------------+-----------------------------+---------+------+----------+-------------+| 1 | SIMPLE | prop_action_batch_reward | index | NULL  | uniq_serial_id_source_index | 15 | NULL | 16434890 | Using index |+----+-------------+--------------------------+-------+---------------+-----------------------------+---------+------+----------+-------------+mysql> SELECT COUNT(serial_id) FROM prop_action_batch_reward;+------------------+| count(serial_id) |+------------------+|  17705069 |+------------------+1 row in set (5.04 sec)

count(主鍵ID)

優(yōu)化器選擇了最優(yōu)的索引idx_create_time來遍歷,而非聚簇索引

mysql> EXPLAIN SELECT COUNT(id) FROM prop_action_batch_reward;+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+| id | select_type | table   | type | possible_keys | key  | key_len | ref | rows | Extra |+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+| 1 | SIMPLE | prop_action_batch_reward | index | NULL  | idx_create_time | 5 | NULL | 16436797 | Using index |+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+mysql> SELECT COUNT(id) FROM prop_action_batch_reward;+-----------+| count(id) |+-----------+| 17705383 |+-----------+1 row in set (4.54 sec)

count(1)

mysql> EXPLAIN SELECT COUNT(1) FROM prop_action_batch_reward;+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+| id | select_type | table   | type | possible_keys | key  | key_len | ref | rows | Extra |+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+| 1 | SIMPLE | prop_action_batch_reward | index | NULL  | idx_create_time | 5 | NULL | 16437220 | Using index |+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+mysql> SELECT COUNT(1) FROM prop_action_batch_reward;+----------+| count(1) |+----------+| 17705808 |+----------+1 row in set (4.12 sec)

count(*)

mysql> EXPLAIN SELECT COUNT(*) FROM prop_action_batch_reward;+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+| id | select_type | table   | type | possible_keys | key  | key_len | ref | rows | Extra |+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+| 1 | SIMPLE | prop_action_batch_reward | index | NULL  | idx_create_time | 5 | NULL | 16437518 | Using index |+----+-------------+--------------------------+-------+---------------+-----------------+---------+------+----------+-------------+mysql> SELECT COUNT(*) FROM prop_action_batch_reward;+----------+| count(*) |+----------+| 17706074 |+----------+1 row in set (4.06 sec)

參考資料

《MySQL實(shí)戰(zhàn)45講》

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
一区二区三区在线播| 国产精品四虎| 91免费版网站在线观看| 99国产精品一区二区三区| www.欧美日本| 97成人精品区在线播放| 国产精品jvid在线观看蜜臀| 后入内射欧美99二区视频| 变态另类丨国产精品| www免费视频观看在线| 国产肥臀一区二区福利视频| 少妇被躁爽到高潮无码文| 8x8x最新地址| 97免费在线观看视频| 91超碰国产精品| 免费a级片网站| 天使萌一区二区三区免费观看| 77777少妇光屁股久久一区| 在线免费不卡视频| jk漫画禁漫成人入口| 欧美第十八页| 91香蕉在线观看| 六月丁香综合| 国产精品丝袜久久久久久app| 日本不卡视频一区二区| 国产精品嫩草99a| 中文字幕 91| 亚洲一区二区在线| 蜜臀久久99精品久久久画质超高清| 黄色片视频在线| 在线一区二区三区四区五区| 最近国语视频在线观看免费播放| 永久555www成人免费| 91手机在线播放| 永久看看免费大片| 久久伊人一区二区| 99日在线视频| 好吊视频一区二区三区四区| 殴美一级特黄aaaaaa| 黄色小视频在线免费看| 高清欧美性猛交xxxx| 日本高清在线观看视频| 在线观看免费av片| 免费三级毛片| 自拍偷拍第9页| 久久中文精品视频| 亚洲电影一级片| 欧美色综合天天久久综合精品| 午夜精品小视频| 精品欧美一区二区在线观看视频| 国产丝袜在线| mm131美女视频| 性欧美暴力猛交69hd| 豆国产97在线| 色黄网站在线观看| 亚洲欧洲一区二区天堂久久| 91麻豆福利| 国产一区二区三区毛片| 欧美亚洲图片小说| 在线国产日韩| 久久99精品久久久久久久青青日本| 97超碰国产精品女人人人爽| 亚洲精品美女久久久久| 中文字幕亚洲国产| 久久日韩粉嫩一区二区三区| 久久精品偷拍视频| 5252色成人免费视频| 日韩av在线天堂网| 9l亚洲国产成人精品一区二三| 国产在线观看99| 国产 欧美 日韩 在线| 第四色在线视频| 浴室偷拍美女洗澡456在线| 日韩av在线播放观看| 性欧美激情精品| 在线性视频日韩欧美| 免费在线播放第一区高清av| 亚洲一二区在线| 国产精品高潮呻吟久久av野狼| 色先锋资源久久综合5566| 欧洲成人免费视频| 日本福利视频网站| 国产视频播放| 亚洲成av人片在线观看www| 久久在线视频免费观看| 变态另类ts人妖一区二区| 免费在线观看h| 国产在线不卡一卡二卡三卡四卡| 精品久久99| free极度另类性欧美| 香蕉国产精品偷在线观看不卡| 国产伦精品一区二区三区高清版| 91精品国产一区二区三区香蕉| 无码人妻精品一区二区中文| 亚洲精品www久久久| 色涩成人影视在线播放| 亚洲天堂一区| 久久久久狠狠高潮亚洲精品| 91国偷自产一区二区三区成为亚洲经典| 日韩免费在线观看av| 91精品国产综合久久久久久| 视频一区二区精品的福利| 国产在线观看不卡| 国产视频在线免费观看| 国产亚洲一本大道中文在线| 国产综合18久久久久久| 欧美剧在线免费观看网站| 亚洲一区二区| 亚洲精品水蜜桃| 亚洲一二三四区不卡| 中文字幕网站在线观看| 中文字幕欧美激情一区| 国产91综合一区在线观看| 激情综合视频| 黑人一级大毛片| 91popny丨九色丨国产| 免费在线毛片| 一级黄色大片视频| 中国黄色片一级| 国产一二三区在线视频| 国产亚洲精品激情久久| 91在线国产电影| 中文在线二区| 色婷婷777777仙踪林| 亚洲经典三级| 精品性高朝久久久久久久| 一区二区欧美在线| 国产不卡在线播放| 亚洲国产日韩一区无码精品久久久| 黄污在线观看| 亚洲美女少妇撒尿| 在线亚洲国产精品网| 欧美精品一区二区三区蜜桃| 亚洲精品一区二三区| 羞羞视频在线观看免费| 美女爆乳18禁www久久久久久| 综合激情网五月| 日韩在线电影一区| 91狠狠综合久久久久久| 欧美性感一类影片在线播放| 久久蜜桃一区二区| 欧美一区=区三区| 亚洲欧美日韩国产一区| 91超碰这里只有精品国产| 亚洲裸色大胆大尺寸艺术写真| 女女互磨互喷水高潮les呻吟| 国产精品美女久久久久aⅴ| 91tv亚洲精品香蕉国产一区7ujn| 色大18成网站www在线观看| 国产资源在线一区| 亚洲国产另类久久久精品极度| 91成人国产精品| 欧美成人三级电影在线| 国产字幕在线看| 久久婷婷国产综合国色天香| 视频一区国产| 亚洲va久久久噜噜噜久久天堂| 精品视频在线播放| 在线观看成人毛片| 日本综合字幕| 亚洲一区二区三区四区五区| 欧美黑人性受xxxx精品| xx视频.9999.com| aⅴ在线免费观看| 亚洲精品高清视频在线观看| 久久夜色精品国产噜噜av| 91精品国产自产在线老师啪| 波多野结衣在线| 国产熟女一区二区丰满| 国产传媒视频在线| 四虎影院成人| 国产98色在线|日韩| 久久久久久亚洲av无码专区| 国产日韩免费视频| 户外极限露出调教在线视频| 欧美在线亚洲一区| 久久99精品久久久久久动态图| 午夜影院在线观看视频| 狠狠干狠狠久久| 激情都市一区二区| 国产成人a亚洲精v品无码| 天天干视频在线| 欧美呦呦网站| 中文字幕激情视频| 欧美色老头old∨ideo| 精品一区二区三区在线| 美女网站免费看| 中国男女全黄大片| 久久亚洲资源中文字| 日本黄色免费在线观看| 97色成人综合网站| 国产精品永久免费| 国产第一页第二页| 欧美中文字幕一二三区视频| 国产精品人人爽| 北条麻妃av高潮尖叫在线观看| 日韩人妻一区二区三区| 国产亚洲va综合人人澡精品| 二区在线观看| 久久99国产视频| 亚洲黄色av女优在线观看| 97人妻精品一区二区三区动漫| 亚洲美女视频| 亚洲三级中文字幕| 色婷婷久久综合| 好吊色在线视频| 精品福利视频导航大全| 久久综合国产精品台湾中文娱乐网| 日本tube24xxxxx| 日本a在线天堂| 国产精品xx| 久久人人97超碰人人澡爱香蕉| 亚洲一区二区三区色| 免费高清在线观看电视| 欧美日韩日本网| 国产 欧美 日韩 在线| 日韩欧美专区| 欧美日韩一级大片| 亚洲综合男人的天堂| 亚洲日本电影在线| 在线观看免费高清视频97| 狠狠狠综合7777久夜色撩人| 丰满少妇xbxb毛片日本| 国产精品久久久久av蜜臀| 久久电影视频| av无码av天天av天天爽| 伊人电影在线观看| 1区不卡电影| 亚洲午夜视频| 在线播放中文一区| 欧美视频日韩视频| 精品日韩中文字幕| 麻豆精品一区二区综合av| 一区二区视频免费| 综合久久综合久久| 成人三级伦理片| 韩国自拍一区| 欧美重口乱码一区二区| 国产精品永久免费| 精品1区2区3区| 一区二区三区四区不卡在线| 亚洲欧美中文另类| 精品国产一区二区三区久久久蜜月| 日韩欧美中字| 亚洲爆乳无码专区| 一区二区三区四区视频| 欧美wwww| 亚洲第一大网站| 午夜精品久久久久久久久久久久久蜜桃| 91影院在线观看| 免费一级特黄毛片| 成年人观看网站| 亚洲综合在线网| 亚洲av首页在线| 成人观看免费完整观看| 欧美日本二区| 2018国产精品| 永久免费不卡在线观看黄网站| 日韩毛片一区| 日韩亚洲国产欧美| 3d动漫精品啪啪一区二区三区免费| 精品国产aaa| 性色av一区二区三区红粉影视| 亚洲欧美日韩在线不卡| 极品国产91在线网站| 五月婷婷久久丁香| 87福利电影网| 九色综合狠狠综合久久| 亚洲精品一线二线三线| 久久久久久久久久久久久久久久久久久| 欧美aaa大片| 欧美亚洲网站| 亚洲 欧美 日韩 在线| 中文字幕精品一区二区三区在线| 国产黄色小视频在线| 人妻互换免费中文字幕| 亚洲人成网亚洲欧洲无码| 一区二区三区四区在线免费视频| 老熟妇高潮一区二区高清视频| 91久久精品www人人做人人爽| 欧美丝袜一区| 日本黄色片一级片| 成人永久免费视频| 日本三级一区二区| 亚洲久本草在线中文字幕| 欧美裸体一区二区三区| 国产精品av一区二区| 成年网站在线视频网站| 欧美日韩在线另类| 亚洲国产精品美女| 久久精品一区二区三区不卡免费视频| 一级毛片视频在线| 999免费视频| 69堂国产成人免费视频| 麻豆美女网站| 国产免费一区二区三区网站免费| 日韩美女一级片| 日本女优北野望在线电影| 欲色天天网综合久久| 在线免费观看av的网站| 欧美一区二区视频在线播放| 亚洲成人精品av| 亚洲色图欧美激情| 91免费观看视频在线| 91极品美女在线| 牛牛精品成人免费视频| 国产精品午夜久久| 国内国产区免费视频| 日本精品久久久久中文| 国产91在线精品| 成人在线一区| 亚洲精品美女久久久久| 欧美精品videosex牲欧美| 四虎永久免费影库二三区| 视频在线观看你懂的| 激情中国色综合| 欧美日韩综合在线免费观看| 久久久久久久久久久久久久久久久久久久| 成人在线观看毛片| 欧美国产日韩一二三区| www久久com| 91porn在线视频| 日韩理伦片在线| 亚洲色图16p| 爱情岛亚洲播放路线| 4438全国亚洲精品在线观看视频| 综合图区亚洲| 欧美精品1区2区3区|