mysql count聚合函式效能

2021-10-07 06:49:18 字數 1050 閱讀 5642

count(*)、count(主鍵id) 和 count(1) 都表示返回滿足條件的結果集的總行數;

而count(字段),則表示返回滿足條件的資料行裡面,引數「字段」不為 null 的總個數。

效能差別

server 層要什麼就給什麼;

innodb 只給必要的值;

現在的優化器只優化了 count(*) 的語義為「取行數」,其他「顯而易見」的優化並沒有做。

對於 count(主鍵 id) 來說,innodb 引擎會遍歷整張表,把每一行的 id 值都取出來,返回給

server 層。server 層拿到 id 後,判斷是不可能為空的,就按行累加。

對於 count(1) 來說,innodb 引擎遍歷整張表,但不取值。server 層對於返回的每一行,放一

個數字「1」進去,判斷是不可能為空的,按行累加。

單看這兩個用法的差別的話,你能對比出來,count(1) 執行得要比 count(主鍵 id) 快。因為從

引擎返回 id 會涉及到解析資料行,以及拷貝字段值的操作。

對於 count(字段) 來說:

如果這個「字段」是定義為 not null 的話,一行行地從記錄裡面讀出這個字段,判斷不能

為 null,按行累加;

如果這個「字段」定義允許為 null,那麼執行的時候,判斷到有可能是 null,還要把值取出

來再判斷一下,不是 null 才累加。

也就是前面的第一條原則,server 層要什麼字段,innodb 就返回什麼字段。

但是 count(*) 是例外,並不會把全部字段取出來,而是專門做了優化,不取值。count(*) 肯定

不是 null,按行累加。

看到這裡,你一定會說,優化器就不能自己判斷一下嗎,主鍵 id 肯定非空啊,為什麼不能按照

count(*) 來處理,多麼簡單的優化啊。

當然,mysql 專門針對這個語句進行優化,也不是不可以。但是這種需要專門優化的情況太多

了,而且 mysql 已經優化過 count(*) 了,你直接使用這種用法就可以了。

所以結論是:按照效率排序的話,count(字段)

SQL 聚合函式 非聚合函式

聚合函式 聚合函式就是對一組值進行計算後返回單個值 即分組 聚合函式在計算時都會忽略空值 null 所有的聚合函式均為確定性函式。即任何時候使用一組相同的輸入值呼叫聚合函式執行後的返回值都是相同的,無二義性。2 聚合開窗函式 聚合函式加上 over 開窗函式就是聚合開窗函式。create table...

百萬行mysql,count 函式的思考與總結

如果你的需要是統計總行數時,為什麼要使用count 而避免使用指定具體的列名?count 函式裡面的引數是列名的的時候,那麼會計算這個欄位有值項的次數。也就是,該欄位沒有值的項並不會進入計算範圍 就是網上常說的值為null的項不納入統計 很多地方都有類似表述 count column counts ...

MySQL中聚合函式count的使用和效能優化

本文的環境是windows 10,mysql版本是5.7.12 log count的基本作用是有兩個 用來獲取滿足條件的資料的數量。但是其中有一些與使用中印象不同的情況,比如當count作用一列 多列 以及使用 來表達整行產生的效果是不同的。示例表如下 如果有null值,在返回的結果中會被過濾掉 s...