精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我被騙好久了!Count(*) 性能最差?

開發 前端
當我們對一張數據表中的記錄進行統計的時候,習慣都會使用 count 函數來統計,但是 count 函數傳入的參數有很多種,比如 count(1)、count(*)、count(字段) 等。

 

大家好,我是小林。

當我們對一張數據表中的記錄進行統計的時候,習慣都會使用 count 函數來統計,但是 count 函數傳入的參數有很多種,比如 count(1)、count(*)、count(字段) 等。

到底哪種效率是最好的呢?是不是 count(*) 效率最差?

我曾經以為 count(*) 是效率最差的,因為認知上 selete * from t 會讀取所有表中的字段,所以凡事帶有 * 字符的就覺得會讀取表中所有的字段,當時網上有很多博客也這么說。

但是,當我深入 count 函數的原理后,被啪啪啪的打臉了!

不多說, 發車!

哪種 count 性能最好?

哪種 count 性能最好?

我先直接說結論:

要弄明白這個,我們得要深入 count 的原理,以下內容基于常用的 innodb 存儲引擎來說明。

count() 是什么?

count() 是一個聚合函數,函數的參數不僅可以是字段名,也可以是其他任意表達式,該函數作用是統計符合查詢條件的記錄中,函數指定的參數不為 NULL 的記錄有多少個。

假設 count() 函數的參數是字段名,如下:

  1. select count(namefrom t_order; 

這條語句是統計「 t_order 表中,name 字段不為 NULL 的記錄」有多少個。也就是說,如果某一條記錄中的 name 字段的值為 NULL,則就不會被統計進去。

再來假設 count() 函數的參數是數字 1 這個表達式,如下:

  1. select count(1) from t_order; 

這條語句是統計「 t_order 表中,1 這個表達式不為 NULL 的記錄」有多少個。

1 這個表達式就是單純數字,它永遠都不是 NULL,所以上面這條語句,其實是在統計 t_order 表中有多少個記錄。

count(主鍵字段) 執行過程是怎樣的?

在通過 count 函數統計有多少個記錄時,MySQL 的 server 層會維護一個名叫 count 的變量。

server 層會循環向 InnoDB 讀取一條記錄,如果 count 函數指定的參數不為 NULL,那么就會將變量 count 加 1,直到符合查詢的全部記錄被讀完,就退出循環。最后將 count 變量的值發送給客戶端。

InnoDB 是通過 B+ 樹來保持記錄的,根據索引的類型又分為聚簇索引和二級索引,它們區別在于,聚簇索引的葉子節點存放的是實際數據,而二級索引的葉子節點存放的是主鍵值,而不是實際數據。

用下面這條語句作為例子:

  1. //id 為主鍵值 
  2. select count(id) from t_order; 

如果表里只有主鍵索引,沒有二級索引時,那么,InnoDB 循環遍歷聚簇索引,將讀取到的記錄返回給 server 層,然后讀取記錄中的 id 值,就會 id 值判斷是否為 NULL,如果不為 NULL,就將 count 變量加 1。

但是,如果表里有二級索引時,InnoDB 循環遍歷的對象就不是聚簇索引,而是二級索引。

這是因為相同數量的二級索引記錄可以比聚簇索引記錄占用更少的存儲空間,所以二級索引樹比聚簇索引樹小,這樣遍歷二級索引的 I/O 成本比遍歷聚簇索引的 I/O 成本小,因此「優化器」優先選擇的是二級索引。

count(1) 執行過程是怎樣的?

用下面這條語句作為例子:

  1. select count(1) from t_order; 

如果表里只有主鍵索引,沒有二級索引時。

那么,InnoDB 循環遍歷聚簇索引(主鍵索引),將讀取到的記錄返回給 server 層,但是不會讀取記錄中的任何字段的值,因為 count 函數的參數是 1,不是字段,所以不需要讀取記錄中的字段值。參數 1 很明顯并不是 NULL,因此 server 層每從 InnoDB 讀取到一條記錄,就將 count 變量加 1。

可以看到,count(1) 相比 count(主鍵字段) 少一個步驟,就是不需要讀取記錄中的字段值,所以通常會說 count(1) 執行效率會比 count(主鍵字段) 高一點。

但是,如果表里有二級索引時,InnoDB 循環遍歷的對象就二級索引了。

count(*) 執行過程是怎樣的?

看到 * 這個字符的時候,是不是大家覺得是讀取記錄中的所有字段值?

對于 selete * 這條語句來說是這個意思,但是在 count(*) 中并不是這個意思。

count(*) 其實等于 count(0),也就是說,當你使用 count(*) 時,MySQL 會將 * 參數轉化為參數 0 來處理。

所以,count(*) 執行過程跟 count(1) 執行過程基本一樣的,性能沒有什么差異。

在 MySQL 5.7 的官方手冊中有這么一句話:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

翻譯:InnoDB以相同的方式處理SELECT COUNT(*)和SELECT COUNT(1)操作,沒有性能差異。

而且 MySQL 會對 count(*) 和 count(1) 有個優化,如果有多個二級索引的時候,優化器會使用key_len 最小的二級索引進行掃描。

只有當沒有二級索引的時候,才會采用主鍵索引來進行統計。

count(字段) 執行過程是怎樣的?

count(字段) 的執行效率相比前面的 count(1)、 count(*)、 count(主鍵字段) 執行效率是最差的。

用下面這條語句作為例子:

  1. //name不是索引,普通字段 
  2. select count(namefrom t_order; 

對于這個查詢來說,會采用全表掃描的方式來計數,所以它的執行效率是比較差的。

小結

count(1)、 count(*)、 count(主鍵字段)在執行的時候,如果表里存在二級索引,優化器就會選擇二級索引進行掃描。

所以,如果要執行 count(1)、 count(*)、 count(主鍵字段) 時,盡量在數據表上建立二級索引,這樣優化器會自動采用 key_len 最小的二級索引進行掃描,相比于掃描主鍵索引效率會高一些。

再來,就是不要使用 count(字段) 來統計記錄個數,因為它的效率是最差的,會采用全表掃描的方式來統計。如果你非要統計表中該字段不為 NULL 的記錄個數,建議給這個字段建立一個二級索引。

為什么要通過遍歷的方式來計數?

你可以會好奇,為什么 count 函數需要通過遍歷的方式來統計記錄個數?

我前面將的案例都是基于 Innodb 存儲引擎來說明的,但是在 MyISAM 存儲引擎里,執行 count 函數的方式是不一樣的,通常在沒有任何查詢條件下的 count(*),MyISAM 的查詢速度要明顯快于 InnoDB。

使用 MyISAM 引擎時,執行 count 函數只需要 O(1 )復雜度,這是因為每張 MyISAM 的數據表都有一個 meta 信息有存儲了row_count值,由表級鎖保證一致性,所以直接讀取 row_count 值就是 count 函數的執行結果。

而 InnoDB 存儲引擎是支持事務的,同一個時刻的多個查詢,由于多版本并發控制(MVCC)的原因,InnoDB 表“應該返回多少行”也是不確定的,所以無法像 MyISAM一樣,只維護一個 row_count 變量。

舉個例子,假設表 t_order 有 100 條記錄,現在有兩個會話并行以下語句:

在會話 A 和會話 B的最后一個時刻,同時查表 t_order 的記錄總個數,可以發現,顯示的結果是不一樣的。所以,在使用 InnoDB 存儲引擎時,就需要掃描表來統計具體的記錄。

而當帶上 where 條件語句之后,MyISAM 跟 InnoDB 就沒有區別了,它們都需要掃描表來進行記錄個數的統計。

如何優化 count(*)?

如果對一張大表經常用 count(*) 來做統計,其實是很不好的。

比如下面我這個案例,表 t_order 共有 1200+ 萬條記錄,我也創建了二級索引,但是執行一次 select count(*) from t_order 要花費差不多 5 秒!

面對大表的記錄統計,我們有沒有什么其他更好的辦法呢?

第一種,近似值

如果你的業務對于統計個數不需要很精確,比如搜索引擎在搜索關鍵詞的時候,給出的搜索結果條數是一個大概值。

這時,我們就可以使用 show table status 或者 explain 命令來表進行估算。

執行 explain 命令效率是很高的,因為它并不會真正的去查詢,下圖中的 rows 字段值就是 explain 命令對表 t_order 記錄的估算值。

第二種,額外表保存計數值

如果是想精確的獲取表的記錄總數,我們可以將這個計數值保存到單獨的一張計數表中。

當我們在數據表插入一條記錄的同時,將計數表中的計數字段 + 1。也就是說,在新增和刪除操作時,我們需要額外維護這個計數表。

責任編輯:武曉燕 來源: 小林coding
相關推薦

2020-06-08 08:20:11

Redis高可用集群

2018-02-02 12:49:09

庫克iPhone喬布斯

2013-04-01 09:50:15

Web框架Web

2019-07-11 15:24:23

CPU芯片元器

2020-07-30 08:09:47

硬件軟件電腦

2021-02-05 08:35:21

私活程序員

2022-07-27 14:24:38

MySQL數據庫SQL

2022-11-17 00:04:38

接口性能查詢

2021-05-19 07:35:00

MySQL數據庫COUNT

2023-07-19 17:27:38

研究方案

2019-09-23 14:36:10

安卓手機蘋果卡頓

2025-07-30 08:07:52

2024-06-04 00:00:20

數據庫

2020-02-14 09:25:53

詐騙網絡犯罪情人節

2012-11-21 11:58:14

惠普收購Autonomy

2021-05-28 07:40:08

selectcount(?)from t

2022-11-16 09:57:23

優化接口

2013-07-23 09:59:57

用戶體驗產品體驗產品

2012-05-30 22:27:24

Android

2021-11-26 09:28:53

鏈接網絡詐騙
點贊
收藏

51CTO技術棧公眾號

欧美极品美女电影一区| 五月天亚洲精品| 国产色综合天天综合网 | 日韩av高清在线看片| 亚洲三区在线观看无套内射| 秋霞av亚洲一区二区三| 久久国产精彩视频| 久久av无码精品人妻系列试探| 日韩一区二区三免费高清在线观看| 亚洲黄色性网站| 欧美一区亚洲二区| 好吊色一区二区| 免费人成在线不卡| 97视频人免费观看| 免费成人深夜夜行网站| 香蕉久久精品| 日韩欧美国产一区二区在线播放| 国产成人午夜高潮毛片| 亚洲欧美另类国产| 成人三级做爰av| 免费高清视频在线一区| 亚洲综合丁香婷婷六月香| 亚洲精品国产精品国自产| 欧美熟妇另类久久久久久不卡| 久久精品国产一区二区| 亲爱的老师9免费观看全集电视剧| 18岁成人毛片| 成人看的视频| 亚洲免费高清视频| 少妇精品无码一区二区三区| 国产日韩中文在线中文字幕| 一本色道a无线码一区v| 人妻夜夜添夜夜无码av| 羞羞网站在线免费观看| 国产亲近乱来精品视频| 精品视频导航| 欧美一级性视频| 国产麻豆欧美日韩一区| 国产精品免费一区| 日韩欧美在线观看免费| 国产日韩欧美一区| 欧美激情精品久久久久久久变态 | 亚洲欧洲视频在线观看| 国产成人在线观看| 国产性色一区二区| 欧美激情亚洲另类| 国精产品一区一区二区三区mba| 国产麻豆精品久久| 亚洲欧美成人在线| 亚洲天堂网一区二区| 久久综合社区| 亚洲国产高潮在线观看| 一二三区视频在线观看| 狂野欧美xxxx韩国少妇| 欧美一区二区在线免费观看| 91看片破解版| av在线精品| 欧美一区二区视频观看视频| 午夜国产福利在线观看| 电影中文字幕一区二区| 日韩一区二区电影| 久久久久中文字幕亚洲精品| 视频二区欧美| 精品国产在天天线2019| 精品人妻伦一二三区久| 日韩精品亚洲aⅴ在线影院| 日韩成人网免费视频| 国产福利在线观看视频| 蜜桃精品噜噜噜成人av| 伊人亚洲福利一区二区三区| 国产美女高潮视频| 欧美1区2区3区| 97精品国产97久久久久久| 国产一区二区三区在线免费观看| 91香蕉视频导航| 69堂精品视频在线播放| 欧美日韩高清一区二区三区| 久久综合在线观看| av动漫精品一区二区| 亚洲二区中文字幕| 国产肥白大熟妇bbbb视频| 日本一区二区免费高清| 久久影视电视剧免费网站清宫辞电视| 亚洲熟女www一区二区三区| 黄色成人av网站| 青青草成人在线| 97国产精品久久久| 国产**成人网毛片九色| 久久精品日产第一区二区三区乱码| 日韩欧美亚洲系列| 中文字幕在线不卡一区二区三区 | 欧美人xxx| 一区二区三区日韩在线观看| 黄色免费视频大全| 日韩国产一二三区| 欧美精品一区二区三| 成人午夜福利一区二区| 亚洲激情五月| 欧美一级bbbbb性bbbb喷潮片| 亚洲一区二区人妻| 成人18视频在线播放| 视频一区视频二区视频三区高| av软件在线观看| 色老头久久综合| 亚洲成人福利视频| 欧美在线免费看视频| 欧美大片免费观看| 亚洲一区在线观| 91小视频在线免费看| 日韩国产精品毛片| 日韩av超清在线观看| 日韩精品专区| 精品色蜜蜜精品视频在线观看| 久久这里只精品| 里番精品3d一二三区| www.日韩.com| 欧美特级黄色片| 成人国产亚洲欧美成人综合网| 亚洲国产精品一区二区第四页av| 俺来俺也去www色在线观看| 欧美日韩在线直播| 免费a在线观看播放| 欧美黄污视频| 成人乱色短篇合集| 爱久久·www| 疯狂蹂躏欧美一区二区精品| 日韩精品xxx| 久久久久久美女精品 | 五月婷婷色丁香| 国产91富婆露脸刺激对白| 亚洲欧美日本国产有色| 色成人免费网站| 亚洲精品综合精品自拍| 国产一级淫片a| 成人精品视频.| 999久久欧美人妻一区二区| 亚洲综合伊人| 北条麻妃久久精品| 在线播放精品视频| 国产精品美女久久久久久 | 天堂中文字幕在线观看| av成人动漫在线观看| 一本久道高清无码视频| 日韩在线精品强乱中文字幕| 久久久久999| 国产精品人妻一区二区三区| 国产精品高潮久久久久无| 日日噜噜噜噜久久久精品毛片| 国产精品日韩精品中文字幕| 欧美一乱一性一交一视频| 四虎精品成人影院观看地址| 欧美日韩午夜剧场| 不卡一区二区在线观看| 午夜在线a亚洲v天堂网2018| 欧洲精品一区色| 日本电影欧美片| 在线视频国产日韩| 在线观看国产精品视频| 综合久久国产九一剧情麻豆| 手机在线国产视频| 欧美一区国产在线| 成人资源视频网站免费| 久久影院午夜精品| 亚洲一级黄色av| 91影院在线播放| 一区二区在线观看视频 | 国产激情无套内精对白视频| 亚洲国产日韩a在线播放| 中文字幕在线播放视频| 久久精品亚洲一区二区| 四虎影院一区二区三区| 亚洲青青久久| 午夜精品www| 黄色国产在线| 91麻豆精品国产91| 国产午夜久久久| 久久久精品免费免费| 欧美婷婷精品激情| 欧美fxxxxxx另类| 久久久久久久久一区二区| 国产日韩另类视频一区| 日韩一区在线视频| 深爱五月激情五月| 91久久香蕉国产日韩欧美9色| 亚洲色图27p| 成人永久免费视频| 成人精品视频一区二区| 93在线视频精品免费观看| 国产成人精品日本亚洲11| 欧美在线va视频| 欧美第一页在线| 九色视频在线观看免费播放 | 国产国语刺激对白av不卡| 黄色的网站在线观看| 日韩高清中文字幕| 亚洲图片欧美在线| 性久久久久久久久久久久 | 亚洲第一av色| 国产一区在线观看免费| 91香蕉国产在线观看软件| 老司机久久精品| 亚洲永久字幕| 2022中文字幕| 大色综合视频网站在线播放| 成人黄色片视频网站| 日韩网站中文字幕| 97精品欧美一区二区三区| 婷婷激情在线| 国产婷婷97碰碰久久人人蜜臀| 国产情侣自拍小视频| 色婷婷综合久久久久中文 | 国产jk精品白丝av在线观看| 国产传媒日韩欧美成人| 五月婷婷激情久久| 国产日韩欧美一区在线| 黄色特一级视频| 欧美激情成人| 日韩精品伦理第一区| 日韩精品一区二区三区中文字幕| 国产精品美女免费看| 天堂av中文在线观看| 欧美激情一区二区三区高清视频 | 黑人精品一区二区| 欧美精品色一区二区三区| 成人一二三四区| 欧美视频在线观看免费网址| 黄色小说在线观看视频| 亚洲欧美激情视频在线观看一区二区三区| 久久久无码人妻精品一区| 成人精品免费网站| 欧洲熟妇的性久久久久久| 国产精品资源在线| 图片区乱熟图片区亚洲| 精品一区二区综合| 五月婷婷激情久久| 青娱乐精品视频在线| 日本www高清视频| 免费在线日韩av| 亚洲熟妇国产熟妇肥婆| 亚洲黄色在线| 妞干网在线视频观看| 国产综合欧美| 水蜜桃色314在线观看| 日韩午夜在线| 大肉大捧一进一出好爽视频| 国产欧美午夜| 欧美日韩国产精品激情在线播放| 亚洲美女视频在线免费观看| 日韩伦理在线免费观看| 国产情侣一区| 国产免费人做人爱午夜视频| 久久久久久久欧美精品| 日本999视频| 毛片av一区二区| 欧美精品 - 色网| 国产一区二区精品久久99| 日本成人xxx| 成人性视频免费网站| 久久久久亚洲AV成人无码国产| 91小视频在线| 日韩欧美黄色网址| 亚洲色欲色欲www| 国产亚洲精品久久久久久无几年桃 | 日本公妇乱淫免费视频一区三区| 欧美久久综合网| 一本一道久久久a久久久精品91| 亚洲澳门在线| 欧洲精品在线播放| 国产日韩欧美| 中文字幕成人在线视频| 国产精品一二三四| 久久久久成人精品无码中文字幕| 久久久www成人免费毛片麻豆| 中字幕一区二区三区乱码| 亚洲欧美综合网| 国产真实乱偷精品视频| 日本黄色一区二区| 97精品人妻一区二区三区在线| 日韩色在线观看| 青青草超碰在线| 久久九九免费视频| 久久男人天堂| 91香蕉亚洲精品| 猫咪成人在线观看| 亚洲国产精品久久久久久女王| 中文字幕日韩欧美精品高清在线| 男女超爽视频免费播放| 日韩高清一区二区| wwwxxxx在线观看| 国产亚洲精品久| 欧美片一区二区| 日本高清不卡视频| 国产日产亚洲系列最新| 亚洲精品小视频| 亚洲大胆人体大胆做受1| 日韩美女视频免费在线观看| 国产一区二区av在线| 久久综合伊人77777麻豆| 亚洲色图88| 亚洲人成色77777| 国产成人啪免费观看软件| 无码少妇精品一区二区免费动态| 亚洲资源在线观看| 自拍偷拍福利视频| 日韩av在线直播| 91高清在线观看视频| 国产精品视频99| 香蕉国产成人午夜av影院| 国产 欧美 日本| 蜜桃视频第一区免费观看| 私密视频在线观看| 亚洲精品ww久久久久久p站| 69av视频在线观看| 亚洲精品乱码久久久久久按摩观| 国产传媒在线播放| 国产精品91在线| 欧美挤奶吃奶水xxxxx| 亚洲激情免费视频| 久久精品国产第一区二区三区| 疯狂揉花蒂控制高潮h| 一区二区三区在线免费| 国产精品乱码久久久| 国产一区二区三区网站| 天堂а√在线最新版中文在线| 国产精品一区二区三区观看| 天堂美国久久| 一本色道久久亚洲综合精品蜜桃| 久久人人爽人人爽| 日韩乱码在线观看| 精品国产一区二区三区av性色| av毛片在线| 成人午夜激情免费视频| 色综合天天爱| 天堂av在线网站| 日本一区二区动态图| 男人的天堂av网站| 精品偷拍各种wc美女嘘嘘| 多野结衣av一区| 精品毛片久久久久久| 亚洲久久成人| 亚洲国产欧美视频| 欧美日韩色婷婷| 黄色在线网站| 国产精品高潮在线| 精品日本12videosex| 爱情岛论坛vip永久入口| 日本一区二区视频在线观看| 日本中文字幕在线观看视频| 亚洲一级一级97网| 久久亚洲人体| 秋霞在线一区二区| 国产盗摄女厕一区二区三区| 国产午夜精品一区二区理论影院 | 成年人在线观看视频| 国产精品久久久久久久久借妻| 欧美色就是色| 天天影视色综合| 亚洲免费三区一区二区| 性做久久久久久久久久| 午夜精品福利视频| 少妇精品久久久一区二区| www.99av.com| 亚洲少妇屁股交4| 黄色小视频免费观看| 欧美亚洲另类制服自拍| 在线成人动漫av| 一本岛在线视频| 一区二区三区在线视频播放| 无码精品黑人一区二区三区| 国产成人精品午夜| 91中文字幕精品永久在线| 亚洲欧美激情一区二区三区| 精品日韩视频在线观看| 在线播放麻豆| 91视频最新| 性一交一乱一区二区洋洋av| 最新中文字幕av| 日韩女优视频免费观看| 中文字幕在线中文字幕在线中三区| 亚洲精品永久www嫩草| 国产成人午夜精品5599| www.国产一区二区| 久久网福利资源网站| 日韩精品丝袜美腿| www.午夜av| 欧美日韩亚洲高清| 黄在线免费看| 久久人人九九| 激情欧美日韩一区二区| 日韩精品一区二区三| 最近中文字幕2019免费| 成人资源在线| 在线能看的av网站| 福利视频导航一区| 国产黄色在线观看| 欧美三级电影在线播放| 国产精品性做久久久久久| 中文字幕在线天堂| 久久青草福利网站| 国产精品毛片一区二区在线看|