精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

99电影网电视剧在线观看| 精品国模在线视频| 亚洲成色www.777999| 在线视频自拍| 国产91精品免费| 日本久久中文字幕| 黄色一级片中国| 美女少妇全过程你懂的久久| 91精品国产综合久久久久久漫画| 欧美男女爱爱视频| 成人高清免费在线播放| 成人综合激情网| 国产精品视频yy9099| 日本一区二区三区免费视频| 偷拍欧美精品| 亚洲三级av在线| 88av在线播放| 久久在线观看| 欧美日韩的一区二区| 欧美爱爱视频免费看| 18视频在线观看网站| 亚洲国产精品激情在线观看| 国产欧美在线一区二区| 国产伦精品一区二区三区四区| 国产日韩欧美一区| 欧美激情综合亚洲一二区| 呻吟揉丰满对白91乃国产区| 夜夜躁狠狠躁日日躁2021日韩| 日韩视频一区二区在线观看| 91亚洲精品久久久蜜桃借种| gogo亚洲高清大胆美女人体 | 91l九色lporny| jizz性欧美2| 欧美一级高清片在线观看| 久久久久国产精品熟女影院| 亚洲天堂免费电影| 亚洲主播在线播放| 最新中文字幕久久| 一广人看www在线观看免费视频| 91丨porny丨国产入口| 高清一区二区三区视频| www日本高清视频| 精品亚洲成a人| 国产精品揄拍500视频| 中文字幕手机在线视频| 久久久蜜桃一区二区人| 欧美一区二粉嫩精品国产一线天| 日韩欧美性视频| 欧美国内亚洲| 久久琪琪电影院| 18精品爽视频在线观看| 国产精品二区影院| 国内精品久久久久久久久| 欧美人妻精品一区二区三区| 黄色日韩在线| 国模精品视频一区二区| 日韩精品一区二区在线播放| 亚洲区第一页| 日韩av电影免费观看高清| 国产精品黄色大片| 久久蜜桃精品| 国产精品高潮在线| 91theporn国产在线观看| 精品午夜久久福利影院| 91九色在线观看| 亚洲国产精品视频在线| av电影一区二区| 鲁丝一区二区三区免费| 电影在线高清| 中文字幕一区二区三区在线播放| 中文字幕日韩精品一区二区| 在线网址91| 天天色天天爱天天射综合| 女性隐私黄www网站视频| 成人一级视频| 日韩欧美一级在线播放| www.免费av| 激情五月色综合国产精品| 色老头一区二区三区| 免费在线观看黄视频| 亚洲一区久久| 国产在线不卡精品| 国产1区在线观看| www久久久久| 日本特级黄色大片| 久草在线中文最新视频| 欧美熟乱第一页| 善良的小姨在线| 亚洲激情播播| 欧美wwwxxxx| 国产情侣自拍av| 另类欧美日韩国产在线| 国产麻豆日韩| 国产精品久久一区二区三区不卡| 亚洲人精品一区| 黄色片视频在线免费观看| 日韩毛片免费看| 日韩精品极品视频| 国产稀缺精品盗摄盗拍| 麻豆久久婷婷| 91久久国产综合久久蜜月精品 | 97se亚洲| 日韩天堂在线视频| 看片网址国产福利av中文字幕| 激情另类小说区图片区视频区| 精品欧美一区二区精品久久| 麻豆网站在线观看| 一本大道av一区二区在线播放| 日本黄色一级网站| 欧美色女视频| 69久久夜色精品国产69| av网站在线免费看| 欧美激情一区二区| 欧美aⅴ在线观看| 亚洲综合影院| 久久精品最新地址| 中文字幕免费播放| 国产亚洲精品久| 久色视频在线播放| 福利欧美精品在线| 欧美成年人在线观看| 久久久久久av无码免费看大片| 成+人+亚洲+综合天堂| 2021国产视频| 羞羞视频在线观看一区二区| 亚洲天堂成人在线视频| 国产性猛交╳xxx乱大交| 成人一区二区三区视频| 日本a级片在线观看| 日本中文字幕视频一区| 永久免费毛片在线播放不卡| 国产91精品一区| 99re成人精品视频| 黄网站欧美内射| 国产精品xxx在线观看| 色综合久久久久久中文网| 国产精品主播一区二区| 国产精品日产欧美久久久久| 久久99999| 欧美综合视频| 国产精品美女在线观看| 成年在线观看免费人视频| 欧美性猛交xxxx免费看| 老牛影视av老牛影视av| 蘑菇福利视频一区播放| 欧美精品中文字幕一区二区| 欧美动物xxx| 亚洲小视频在线观看| 黑人精品无码一区二区三区AV| 91在线云播放| aa免费在线观看| 美女毛片一区二区三区四区| 国产91色在线|免| 国产在线自天天| 欧美系列一区二区| 亚洲一区电影在线观看| 国产一区二区0| 免费毛片网站在线观看| 日韩av不卡一区| 国产91色在线免费| 日本成人网址| 日韩欧美亚洲一区二区| 成人午夜视频精品一区| 久久九九久久九九| 天天干天天综合| 欧美精品一卡| 久久综合一区二区三区| 国产经典一区| 久久国产精品久久久久| 可以免费观看的毛片| 色综合久久久久久久久久久| 国产在视频线精品视频| 国产成人免费xxxxxxxx| av免费观看网| 久久中文亚洲字幕| 爱情岛论坛亚洲入口| 另类激情视频| 日韩在线播放一区| 丰满人妻一区二区三区免费| 日韩欧美亚洲范冰冰与中字| 青青青视频在线免费观看| 国产精品99久久久久久宅男| 极品粉嫩国产18尤物| 国产传媒欧美日韩成人精品大片| 国产欧美精品va在线观看| 国产高清一区二区三区视频| 亚洲国产黄色片| 亚洲图片欧美在线| 亚洲国产一区视频| 懂色av粉嫩av浪潮av| 国产99久久久精品| 亚洲 欧美 日韩系列| 亚洲无吗在线| 亚洲午夜精品一区二区| 巨人精品**| 91精品视频免费观看| 一区二区三区四区日本视频| 不卡av电影院| 国产高清视频免费最新在线| 精品欧美一区二区三区精品久久| 少妇高潮av久久久久久| 亚洲中国最大av网站| 国产激情av在线| 91在线看国产| 在线观看一区二区三区视频| 免费人成在线不卡| 波多野结衣之无限发射| 综合日韩在线| 神马影院午夜我不卡影院| 国产精品白丝av嫩草影院| 成人网在线免费看| 亚洲精品一区三区三区在线观看| 久久久久这里只有精品| 中文字幕有码在线观看| 日韩中文字幕不卡视频| 欧美日韩激情视频一区二区三区| 欧美成人三级电影在线| 国产又粗又猛视频免费| 91福利在线导航| 亚洲 欧美 视频| 亚洲黄色小视频| 日韩在线不卡av| 中国av一区二区三区| 老司机福利av| 91丨国产丨九色丨pron| 国产麻豆剧传媒精品国产| 国产综合成人久久大片91| 亚洲欧美国产日韩综合| 免费亚洲婷婷| 男人操女人免费软件| 亚洲精品一级| 波多野结衣家庭教师在线| 亚洲第一伊人| 免费拍拍拍网站| 亚洲无线一线二线三线区别av| 经典三级在线视频| 女人香蕉久久**毛片精品| 国产成人精品免费看在线播放| 久久影院一区| 欧美h视频在线观看| 亚洲国产精品久久久天堂| 日本三级福利片| 欧美在线二区| www污在线观看| 一区二区精品| 国产福利视频在线播放| 日韩精品国产欧美| 亚洲人辣妹窥探嘘嘘| 美国三级日本三级久久99| jizz欧美性11| 韩国v欧美v亚洲v日本v| 中文字幕无码毛片免费看| 国产高清不卡一区| 国产十八熟妇av成人一区| 91视频精品在这里| 免费一级做a爰片久久毛片潮| 久久久高清一区二区三区| 干b视频在线观看| 亚洲欧洲一区二区三区| 老女人性淫交视频| 香蕉加勒比综合久久| 黄色片免费观看视频| 在线观看视频一区二区| 国产伦理一区二区| 亚洲精品第一页| 国产尤物视频在线| 欧美成人激情图片网| aaa在线播放视频| 国产成人亚洲精品| 亚洲精品777| 国产三级精品在线不卡| 自拍欧美一区| 最新视频 - x88av| 影音国产精品| 亚洲一区二区三区四区五区xx| 国产在线一区观看| 日韩一卡二卡三卡| 国产喷水吹潮视频www| 亚洲精品在线网站| 国产系列电影在线播放网址| 久久久精品久久| 国产在线88av| 91欧美精品午夜性色福利在线 | 黄频免费在线观看| 国产精品久久97| 亚洲综合色婷婷在线观看| 奇米影视首页 狠狠色丁香婷婷久久综合 | 久久成人免费网站| 亚洲中文字幕无码一区| 欧美高清在线精品一区| 久久精品女人毛片国产| 欧美在线免费观看视频| 性做久久久久久久久久| 国产一区二区三区在线播放免费观看| 18+视频在线观看| 日本道色综合久久影院| 精品麻豆剧传媒av国产九九九| 久久久水蜜桃| 国产精品v日韩精品v欧美精品网站| 亚洲成熟丰满熟妇高潮xxxxx| 国产一区二区不卡在线| 色一情一交一乱一区二区三区| 亚洲一区二区中文在线| 黄色av一区二区| 亚洲激情第一页| www.久久ai| 国产精品视频在线观看| 美女扒开腿让男人桶爽久久动漫| gogogo免费高清日本写真| 久久久久久黄| av直播在线观看| 亚洲国产你懂的| 国产又爽又黄免费软件| 一区二区三区视频免费| 免费毛片b在线观看| 动漫一区二区在线| 欧美福利一区| 日韩av片专区| 国产精品激情偷乱一区二区∴| 欧美日韩乱国产| 亚洲精品福利在线观看| 欧美人与禽性xxxxx杂性| 成人福利在线观看| 日韩在线视频精品| 日韩无套无码精品| 久久久久久久久久久黄色| 日本va欧美va国产激情| 精品国产电影一区二区| 青春草视频在线| 亚洲精品免费一区二区三区| 香蕉精品视频在线观看| 婷婷激情5月天| 国产精品卡一卡二卡三| 五月婷婷丁香在线| 中文字幕不卡av| 日本一区免费网站| 日本一区免费看| 日韩电影在线免费| 欧美成人国产精品一区二区| 色成年激情久久综合| 免费资源在线观看| 国产suv精品一区二区| 国产精品一区2区3区| 黄色av免费在线播放| 国产日产亚洲精品系列| 国产91av在线播放| 最近日韩中文字幕中文| 91麻豆精品国产综合久久久| 中文字幕一区二区三区有限公司 | 91在线中文| 国产精品免费在线| 99国产精品私拍| 亚洲专区区免费| 色一情一伦一子一伦一区| 毛片网站在线| 国产在线播放不卡| 午夜亚洲福利| 99久久人妻精品免费二区| 精品久久久在线观看| 国产综合在线观看| 国产欧美日韩精品在线观看| 亚洲国产成人精品女人| 国产精品99精品无码视亚| 黄色一区二区在线| 国产福利在线| 成人激情视频在线播放| 午夜欧美精品| 内射中出日韩无国产剧情| 欧美色欧美亚洲另类二区| 成人免费在线| 国内精品二区| 青青草国产精品97视觉盛宴| 亚洲一级生活片| 亚洲国产精品久久久久| 日本精品裸体写真集在线观看| 一区二区三区四区免费观看| 国产高潮国产高潮久久久91| 91成人免费网站| 成人在线免费看黄| 久久精品国产美女| 久久国产精品99久久人人澡| 精品在线视频免费观看| 亚洲欧美激情另类校园| 国产亚洲久久| 欧美黄网站在线观看| 中文字幕亚洲电影| 五月婷婷综合久久| 成人精品福利视频| 亚洲在线网站| 天天看片中文字幕| 亚洲性无码av在线| 91精品短视频| 波多野结衣xxxx| 午夜天堂影视香蕉久久| 色综合久久久久综合一本到桃花网| 国产欧美日韩一区二区三区| 久久97超碰国产精品超碰| 在线观看日本网站| 欧美夫妻性生活视频| 水蜜桃精品av一区二区|