mysql中count(*)、count(1)、count(主鍵)、count(字段)的區別

文章目錄

  • count函數的語義
  • count(主鍵)
  • count(1)
  • count(*)
  • count(字段)
  • 替代方案
    • explain或者show table status
    • 中間表或者其他數據庫計數

以下分析都是基于 select count(?) from table 這個語句來分析,不帶過濾條件。

count函數的語義

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

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

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

count(主鍵)

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

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

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

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

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

count(1)

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

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

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

count(*)

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

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

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

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

count(字段)

count(字段) 的執行效率相比前面的 count(1)、 count(*)、 count(主鍵字段) 執行效率是最差的。主要原因是因為它是個全表掃描操作。

替代方案

explain或者show table status

如果對于count值不是要求很精確可以通過執行 explain或者show table status來獲取值

中間表或者其他數據庫計數

如果要求比較精確可以在寫數據后通過中間表或者其他數據庫去記錄當前數量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208970.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BFC(Block Formatting Contexts)塊級格式化上下文

塊格式化上下文(block formatting context) 是頁面上的一個獨立的渲染區域,容器里面的子元素不會在布局上影響到外面的元素。它是決定塊盒子的布局及浮動元素相互影響的一個因素。 下列情況將創建一個塊格式化上下文: 使用float…

阿里云輕量應用服務器與云服務器ECS對比

與云服務器ECS相比,輕量應用服務器使用門檻較低,配置簡便,能讓您快速上手并部署簡單的應用或網站,更適合個人開發者、學生等用戶。本文介紹輕量應用服務器與云服務器ECS的特點和區別。 產品對比 輕量應用服務器與云服務器ECS的產…

IO多路轉接之select

IO多路轉接之select 1. IO多路轉接(復用)2. select2.1 函數原型2.2 細節描述 3. 并發處理3.1 處理流程3.2 通信代碼 原文鏈接 1. IO多路轉接(復用) IO多路轉接也稱為IO多路復用,它是一種網絡通信的手段(機…

算法訓練營Day10(棧和隊列)

理論知識 java語言的棧和隊列。這篇文章總結的不錯 http://t.csdnimg.cn/cOC8q 232.用棧實現隊列 232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; public class MyQueue {// 3 4// in// out 4 3Stack<Integer> in;Stack<Integer> out;public My…

C# 計算兩個日期的相差天數

string str1 "2017-2-13 23:59:59"; string str2 "2017-2-14 0:00:01"; DateTime d1 Convert.ToDateTime(str1); DateTime d2 Convert.ToDateTime(str2); Console.WriteLine(d1.Date); Console.WriteLine(DateTime.Now);//當前時間 Console.WriteLine(…

【目標檢測算法】IOU、GIOU、DIOU、CIOU

目錄 參考鏈接 前言 IOU(Intersection over Union) 優點 缺點 代碼 存在的問題 GIOU(Generalized Intersection over Union) 來源 GIOU公式 實現代碼 存在的問題 DIoU(Distance-IoU) 來源 DIOU公式 優點 實現代碼 總結 參考鏈接 IoU系列&#xff08;IoU, GIoU…

kubernetes的服務發現(二)

如前面的文章我們說了&#xff0c;kubernetes的服務發現是服務端發現模式。它有一個服務注冊中心&#xff0c;使用DNS作為服務的注冊表。每個集群都會運行一個DNS服務&#xff0c;默認是CoreDNS服務。每個服務都會在這個DNS中注冊。注冊的大致過程&#xff1a; 1、向kube-apise…

WPF使用WebBrowser報腳本錯誤問題處理

前言 WPF使用WebBrowser報腳本錯誤問題處理,我們都知道WPF自帶的WebBrowser都用的IE內核,但是在特殊的條件下我們還需要用到它,比如展示純html簡單的頁面。再展示主流頁面的時候比如用到Jquery高級庫或者VUE等當前主流站點時經常就會報JS腳本錯誤,在Winform里面我們一句代…

【精選】設計模式——工廠設計模式

工廠設計模式是一種創建型設計模式&#xff0c;其主要目的是通過將對象的創建過程封裝在一個工廠類中來實現對象的創建。這樣可以降低客戶端與具體產品類之間的耦合度&#xff0c;也便于代碼的擴展和維護。 工廠設計模式&#xff1a; 以下是Java中兩個常見的工廠設計模式示例…

C++ 關于結構體struct的一些總結

文章目錄 一、 結構體(struct)是什么&#xff1f;&#xff08;1&#xff09;概念&#xff08;2&#xff09;struct 與 calss 的區別 二、定義、聲明與初始化&#xff08;1&#xff09;三種定義結構體的方法&#xff1a;&#xff08;2&#xff09;結構體變量初始化 三、結構體嵌…

C++實現進程端口網絡數據接收系統設計示例程序

一、問題描述 最近做了一道簡單的系統設計題&#xff0c;大概描述如下&#xff1a; 1.一個進程可以綁定多個端口&#xff0c;用于監聽接收網絡中的數據&#xff0c;但是一個端口只能被一個進程占用 2.1 < pid < 65535, 1 < port < 100000, 1 < topNum < 5, …

ros2/ros安裝ros-dep||rosdep init錯誤

第一個錯誤的做法&#xff1a; sudo apt-get install python3-pip sudo pip3 install 6-rosdep sudo 6-rosdep 如果使用上述代碼將會摧毀整個系統&#xff0c;不重裝系統反正我是搞不定啊&#xff0c;因為我不知道那個寫軟件的人到底做了什么。因為這個我安裝的版本是humble&…

AlexNet 閱讀筆記

“ImageNet Classification with Deep Convolutional Neural Networks” (Krizhevsky 等, 2012, p. 1) 使用深度卷積神經網絡進行 ImageNet 分類 3公式&#xff0c;26個引用&#xff0c;4張圖片&#xff0c;2個簡單表格 Abstract 我們訓練了一個大型深度卷積神經網絡&#…

Leetcode刷題詳解——環繞字符串中唯一的子字符串

1. 題目鏈接&#xff1a;467. 環繞字符串中唯一的子字符串 2. 題目描述&#xff1a; 定義字符串 base 為一個 "abcdefghijklmnopqrstuvwxyz" 無限環繞的字符串&#xff0c;所以 base 看起來是這樣的&#xff1a; "...zabcdefghijklmnopqrstuvwxyzabcdefghijklm…

卷積之后通道數為什么變了

通道數增多與卷積之后得到的圖像特征數量有關 卷積層的作用本來就是把輸入中的特征分離出來變成新的 feature map&#xff0c;每一個輸出通道就是一個卷積操作提取出來的一種特征。在此過程中ReLU激活起到過濾的作用&#xff0c;把負相關的特征點去掉&#xff0c;把正相關的留…

C++:vector增刪查改模擬實現

C:vector增刪查改模擬實現 前言一、迭代器1.1 非const迭代器&#xff1a;begin()、end()1.2 const迭代器&#xff1a;begin()、end() 二、構造函數、拷貝構造函數、賦值重載、析構函數模擬實現2.1 構造函數2.1.1 無參構造2.1.2 迭代器區間構造2.1.3 n個值構造 2.2 拷貝構造2.3 …

vue路由導航守衛(全局守衛、路由獨享守衛、組件內守衛)

目錄 一、什么是Vue路由導航守衛&#xff1f; 二、全局守衛 1、beforeEach 下面是一個beforeEach的示例代碼&#xff1a; 2、beforeResolve 下面是一個beforeResolve的示例代碼&#xff1a; 3、afterEach 下面是一個afterEach的示例代碼&#xff1a; 三、路由獨享守衛…

Shell - 學習筆記 - 1.14 - 如何編寫自己的Shell配置文件(配置腳本)?

第1章 Shell基礎(開胃菜) 14 - 如何編寫自己的Shell配置文件(配置腳本)? 學習了《Shell配置文件的加載》一節,讀者應該知道 Shell 在登錄和非登錄時都會加載哪些配置文件了。對于普通用戶來說,也許 ~/.bashrc 才是最重要的文件,因為不管是否登錄都會加載該文件。 我們…

【數據處理】NumPy數組的合并操作,如何將numpy數組進行合并?

&#xff0c;NumPy中的合并操作是指將兩個或多個數組合并成一個數組的操作。這種操作可以通過不同的函數來實現。 一、橫向合并&#xff08;水平合并&#xff09; 橫向合并是指將兩個具有相同行數的數組按列方向合并成一個數組的操作。在NumPy中&#xff0c;可以使用hstack()…

044:vue中引用json數據的方法

第044個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…