【MySQL】聊聊count的相關操作

在平時的操作中,經常使用count進行操作,計算統計的數據。那么具體的原理是如何的?為什么有時候執行count很慢。

count的實現方式

select count(*) from student;

對于MyISAM引擎來說,會把一個表的總行數存儲在磁盤上,因此執行count(*)的時候直接返回,效率高。
但是對于InnoDB引擎來說,執行count ()的時候,需要把數據一行一行從引擎中讀出來,然后累積計數。
但是因為InnoDB支持事務以及并發能力,所以大多數業務都選擇是InnoDB存儲引擎。

為什么數據越來越多的時候,InnoDB不存儲一個總行數直接返回呢,那么因為在不同的隔離級別下,每個事務所看到的數據是不一樣的。
比如針對如下,開啟三個會話,因為MVCC的原因,返回的行數是不一樣的。
在這里插入圖片描述
會話A:因為當前開始一個事務,回話B、C對于A是不可見的。所以返回1W
會話B:會話C插入一行自動提交,所以當會話B自己在插入一條數據的時候,可以查到2條記錄,所以就是10002行。
會話C:因為會話B沒有提交事務,所以只能看到自己本次的新增記錄,所以就是10001行。

根本原因在于:和InnoDB的事務設計有關系,通過多版本并發控制,每一行記錄需要判斷對自己是否可見,所以只能一行行判斷

做的一點優化
主鍵索引樹保存的是數據,普通索引樹保存的是主鍵值,因此普通索引樹要比主鍵索引樹小很多,所以對于count(*) 來說,遍歷哪個樹結果都是一樣的,為了盡量減少掃描的數據量,會使用最小的那顆樹進行統計遍歷。

Count(主鍵)

在統計count函數多少記錄時,mysql的server層維護一個count的變量。每循環從innodb讀取一行記錄,并且count函數指定的參數不為null ,就將變量count+1。所以當一個表只有主鍵時,會從主鍵索引樹上進行查詢,當主鍵和普通索引都存在時,會從普通索引樹上進行查詢,因為這樣遍歷二級索引的IO成本比遍歷主鍵索引的IO成本小很多。因此優化器優先選擇的是二級索引。
在這里插入圖片描述
在這里插入圖片描述

Count(1)

select count(1) from t_order;

統計的是這個表里有多少記錄

count(id) 和 count(1)的 區別其實就是看是否讀取數據的記錄內容,count(1)因為是直接判斷1,所以只需要統計對應有多少記錄就可以,但是count(id) 需要獲取的行記錄的id 并且不為空 才會進行總數計算。

Count(*)

count(*) 其實mysql會將參數 轉換成0來處理
在這里插入圖片描述

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
翻譯:InnoDB以相同的方式處理SELECT COUNT(*)和SELECT COUNT(1)操作,沒有性能差異。

所以count(1) = count(*) = count(0)

count(字段)

select count(name) from t_order;

統計這個表里有多少行name不為null的記錄。性能最差,會以全表掃描的方式進行處理。

在這里插入圖片描述

在這里插入圖片描述

小結

count1、count * 、count(id) 在執行的時候,如果表里有二級索引,優化器優先選擇二級索引進行掃描。

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

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

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

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

相關文章

Linux下Vision Mamba環境配置+多CUDA版本切換

上篇文章大致講了下Vision Mamba的相關知識,網上關于Vision Mamba的配置博客太多,筆者主要用來整合下。 筆者在Win10和Linux下分別嘗試配置相關環境。 Win10下配置 失敗 \textcolor{red}{失敗} 失敗,最后出現的問題如下: https://…

基于物聯網架構的電子小票服務系統

1.電子小票物聯網架構 采用感知層、網絡層和應用層的3層物聯網體系架構模型,電子小票物聯網的架構見圖1。 圖1 電子小票物聯網架構 感知層的小票智能硬件能夠取代傳統的小票打印機,在不改變商家原有收銀系統的前提下,采集收音機待打印的購物…

react中的數據驅動視圖,useState()的使用

前端開發如今有一個很重要的思想就是數據驅動視圖,數據發生變化使ui發生變化,比如一個變量count,為0顯示三個按鈕,為1顯示一個按鈕,為2顯示兩個按鈕。這就是一個簡單的數據驅動視圖。 import { useState } from reactf…

修改 ant design tour 漫游式導航的彈窗邊框樣式

一 說明 應項目要求,調整ant design tour 彈窗邊框的樣式。tour 原本樣式是有遮罩層,因此沒有邊框看起來也不突兀。原圖如下: 但是UI設計是取消遮罩層,并設置邊框樣式。當 取消 了遮罩層,沒有設置邊框樣式的圖片如下&a…

python考試成績管理與分析:從列表到方差

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、考試成績的輸入與列表管理 二、成績的總分與平均成績計算 三、成績方差的計算 四、成…

雙指針用法練習題(2024/5/26)

1三數之和 給你一個整數數組 nums ,判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k ,同時還滿足 nums[i] nums[j] nums[k] 0 。請 你返回所有和為 0 且不重復的三元組。 注意:答案中不可以包含重復的三元…

人工智能場景下的網絡負載均衡技術

AI技術驅動智能應用井噴,智能算力增速遠超通用算力。IDC預測,未來五年,我國智能算力規模年復合增長率將超50%,開啟數據中心算力新紀元。隨著需求激增,數據中心或智算網絡亟需擴容、增速、減時延,確保網絡穩…

rockylinux 利用nexus 搭建私服yum倉庫

簡單說下為啥弄這個私服,因為自己要學習一些東西,比如新版的k8s等,其中會涉及到一些yum的安裝,為了防止因網絡問題導致yum安裝失敗,和重復下載,所以弄個私服,當然也有為了意外保障的想法&#x…

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解-類的聲明周期-加載器 1 初識JVM1.1 什么是JVM1.2 JVM的功能1.2.1 即時編譯 1.3 常見JVM 2 字節碼文件詳解2.1 Java虛擬機的組成2.2 字節碼文件的組成2.2.1 正確打開字節碼文件2.2.2 字節碼組成2.2.3 基礎信息2.2.3.1 魔數2.2.3.1 主副…

【C++】右值引用 移動語義

目錄 前言一、右值引用與移動語義1.1 左值引用和右值引用1.2 右值引用使用場景和意義1.3 右值引用引用左值及其一些更深入的使用場景分析1.3.1 完美轉發 二、新的類功能三、可變參數模板 前言 本篇文章我們繼續來聊聊C11新增的一些語法——右值引用,我們在之前就已…

進程間通信的方式中,socket和消息隊列的區別

進程間通信的方式中,socket和消息隊列的區別 進程間通信方式中,socket和消息隊列的主要區別在于通信的方式和跨機通信的能力。 socket是通過網絡傳輸的方式來實現進程間通信,并且可以跨主機;而消息隊列是通過內核提供的緩沖區進…

Flutter 中的 AbsorbPointer 小部件:全面指南

Flutter 中的 AbsorbPointer 小部件:全面指南 在Flutter中,AbsorbPointer是一個特殊的小部件,用于吸收(或“吞噬”)所有傳遞到其子組件的指針事件(如觸摸或鼠標點擊)。這在某些情況下非常有用&…

民國漫畫雜志《時代漫畫》第22期.PDF

時代漫畫22.PDF: https://url03.ctfile.com/f/1779803-1248634856-2c7010?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了,截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Typescript高級: 深入理解Extract類型

概述 在TypeScript這一逐漸成為前端開發首選的靜態類型檢查語言中&#xff0c;類型系統提供了豐富的工具來幫助開發者編寫更加健壯和可維護的代碼。其中&#xff0c;Extract<T, U>是一個強大的內置實用類型&#xff0c;用于從一個聯合類型T中提取出屬于另一個類型U的那些…

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成!

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成&#xff01; 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 這篇論文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一種新穎的技術&#xff0c…

Modal.method() 不顯示頭部的問題

ant-design中的Modal組件有兩種用法&#xff1a; 第一種是用標簽&#xff1a;<a-modal></a-modal> 第二種是用Api&#xff1a;Modal.info、Modal.warning、Modal.confirm...... 一開始項目中這兩種用法是混用的&#xff0c;后面UI改造&#xff0c;需要統一樣式&…

一個程序員的牢獄生涯(37)任務

星期一 任 務 我走回大鐐面前后,把雙手抱著的衣服遞給大鐐,但我并沒有把手里的東西也遞給他。現在的大鐐坐著,我站著,這個時候要給大鐐的話,肯定能被身邊的棍子或六子看到,甚至被所有號子里的人都看到。因為此時,所有人的目光都盯著我手里的衣服,盯著我和大鐐看。 “鐐…

Shell字符串變量

目標 能夠使用字符串的3種方式 掌握Shell字符串拼接 掌握shell字符串截取的常用格式 能夠定義Shell索引數組和關聯數組 能夠使用內置命令alias,echo,read,exit,declare操作 掌握Shell的運算符操作 Shell字符串變量 介紹 字符串&#xff08;String&#xff09;就是一系…

使用LabVIEW時遇到VISA屬性錯誤 -1073807331的解決方案

在LabVIEW或VeriStand中使用VISA屬性時&#xff0c;可能會遇到錯誤 -1073807331。這一錯誤的具體描述如下&#xff1a; 解決方案 導致VISA屬性出現此錯誤的原因主要有以下四種&#xff1a; 屬性不被使用的串行總線支持 示例 A.1&#xff1a;Is Port Connected VISA屬性僅支持由…

React(四)memo、useCallback、useMemo Hook

目錄 (一)memo API 1.先想一個情景 2.用法 (1)props傳入普通數據類型的情況 (2)props傳入對象的情況 (3)props傳入函數的情況 (4)使用自定義比較函數 3.什么時候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo實現組件記憶化 3.useMemo實現函數記憶化 …