成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

select count(?) from t之間的性能差別是什么

開發 前端
今天我們就來聊聊這幾種不同的統計方式是怎么實現的,他們之間的性能差別是什么。

[[402107]]

在開發中,我們一定經常遇到需要統計表總記錄的時候,在 select count(?) from t 這樣的查詢語句里面,count(*)、count(主鍵 id)、count(字段) 和 count(1) 該怎么選擇呢?

阿里巴巴開發規約其中MySQL規約中,有4條都在規范count的用法,我們查看其中的一條:

【強制】不要使用count(列名)或count(常量)來替代count(*), count(*)就是SQL92定義的標準統計行數的語法,跟數據庫無關,跟NULL和非NULL無關。

說明:count(*)會統計值為NULL的行,而count(列名)不會統計此列為NULL值的行。

那么今天我們就來聊聊這幾種不同的統計方式是怎么實現的,他們之間的性能差別是什么。

count()函數

首先我們需要了解count() 的語義。

count()是一個聚合函數,對于返回的結果集,一行行的判斷,如果count函數的參數不是null,累計值就加1,否則不加。最后返回累計值。如果沒有則返回0。

count(*)、count(主鍵 id) 和 count(1) 都表示返回滿足條件的結果集的總行數;而 count(字段),則表示返回滿足條件的數據行里面,參數“字段”不為null的總個數。

接下來我們具體分析每種統計方式的性能差別。

count(*)

我們在分析一條SQL語句的實現時,一定不能脫離存儲引擎,在不同的MySQL存儲引擎中,count(*)有不同的實現。

  • MyISAM引擎把一個表的總行數存在了磁盤上,所以在執行count(*)的時候直接返回磁盤上的這個數就可以,效率很高。
  • InnoDB引擎是需要一行一行地從引擎中讀出數據然后累計計數。

這個時候你是不是在想,MySQL建表時的存儲引擎已經默認為InnoDB了,而且很多MySQL相關的書籍中也提到不是特別場景的必要,就使用InnoDB。

但是我們在使用count(*)做統計的時候隨著表記錄的增加效率會越來越慢,InnoDB怎么就不能跟MyISAM一樣也把總記錄數提前存儲起來呢?

這里主要的一個原因是InnoDB是支持事務的,由于MVCC的原因,InnoDB表在某個時刻應該返回多少行是不確定的,它必須根據當前的事務隔離級別判斷某一個記錄對于當前事務是否可見。

雖然InnoDB是需要一行一行的統計,但是MySQL也是做了優化的。通過前面索引文章介紹的知識我們了解到,InnoDB分為主鍵索引樹和普通索引樹,普通索引樹的葉子節點是主鍵值而不是行記錄。所以,普通索引樹要比主鍵索引樹小很多,所以count(*)在遍歷索引樹的時候會找最小的那棵樹來遍歷。

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

count(*)也并不會把全部字段取出來,而是做了優化,不取值。

count(*)的參數肯定不是null,按行累加之后返回結果。

count(主鍵 id)

count(主鍵 id) ,InnoDB引擎會遍歷整張表,把每一行的id值取出來,傳給server層。server層拿到引擎給的id值后,判斷是不可能為空的,就按行累加。

count(1)

count(1),InnoDB引擎遍歷整張表,但是不取值。server層對于返回的每一行存放一個數字1,判斷是不可能為空過的,按行累加。

count(字段)

而對于count(字段)字段來說,我們需要分兩種情況分析參數字段。

如果這個參數字段是不允許為null(not null)的,那么InnoDB引擎則一行行地從記錄里面讀取這個字段,判斷不能為null,則按行累加。

如果這個參數字段是允許為null的,那么執行的時候,判斷到可能是null的時候還要把值取出來再判斷一次,不是null才累加。

小結

count(字段)和count(主鍵 id)因為需要從引擎中返回值,會涉及到解析數據行以及拷貝字段的操作,性能上差于其他兩種。

而count(字段)還需要判斷字段參數是否為null,多了判斷的操作,性能上會差于count(主鍵 id)。

count(1)和count(*)都不會涉及到取值,性能上差別不大。

所以結論就是,按照查詢效率排名結果如下:

count(字段)<count(主鍵 id)<count(1)≈count(*)。

按照開發規范,建議盡量使用count(*)。

我是勾勾,認真生活,快樂工作!愿你每天開心!

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2018-05-21 21:26:59

Apache HiveHbaseSQL

2022-11-18 16:10:03

云計算虛擬機

2017-03-01 21:15:44

AI機器學習深度學習

2023-02-24 08:03:24

ChatGPT人臉識別分支

2019-03-19 19:49:04

負載均衡硬件軟件

2022-11-15 10:03:34

2023-10-23 11:07:37

HTTPRPC

2023-06-09 09:10:06

nftablesiptables

2022-09-19 15:57:36

JVM對象緩存

2019-06-12 09:50:23

selectMySQLSQL

2020-09-06 22:04:48

Python運算符開發

2025-02-06 08:44:11

MySQLEXISTSIN

2024-12-30 07:20:00

Redis數據庫MySQL

2016-03-21 10:40:53

RDDSpark SQL數據集

2021-03-15 14:00:56

PythonC語言編程語言

2021-09-01 09:19:03

人工智能機器學習數據分析

2015-02-26 10:29:41

Google百度

2021-05-06 15:08:40

開發前端后端

2022-07-06 06:17:51

PandasScipynumpy

2021-10-27 10:12:54

DockerContainerdRunC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久国产精品入口麻豆 | 国产精品a一区二区三区网址 | 国产一级视频在线观看 | 永久av | 国产一区二区三区日韩 | 亚洲欧美在线一区 | 欧美日韩国产传媒 | 中文字幕99| 久久午夜视频 | 欧美成人精品一区二区男人看 | 久久国产精品72免费观看 | 亚洲精品乱码久久久久久蜜桃91 | 免费的一级视频 | 亚洲精品一区二区三区在线 | 成人妇女免费播放久久久 | 精一区二区 | 香蕉二区| 日韩精品一区二区三区中文在线 | 欧美国产日韩在线观看成人 | 国产精品三级 | 国产精品久久久久久久久久三级 | 一区二区视频在线观看 | 国产91成人 | 精品一区二区三区日本 | 日韩插插| 九九福利 | 有码在线 | 欧日韩在线观看 | www九色 | 一区天堂| 一区二区精品视频 | av一区二区三区四区 | 日韩国产一区二区三区 | 国产999精品久久久 日本视频一区二区三区 | 国产清纯白嫩初高生在线播放视频 | 日日射夜夜骑 | 黄色免费在线观看网站 | 中文字幕日韩一区 | 亚洲3p| h视频在线观看免费 | 欧美三级三级三级爽爽爽 |