count(1)比count(*)效率高?

来源:https://www.cnblogs.com/vandusty/archive/2020/02/01/12248605.html
-Advertisement-
Play Games

`SELECT COUNT( ) FROM table_name`是個再常見不過的統計需求了。 本文帶你瞭解下 的`COUNT`函數。 一、 函數 關於 函數,在 官網中有 "詳細介紹" : 翻譯一下: 1. ,返回 語句檢索的行中 的值不為 的數量,結果是一個 值。 1. 如果查詢結果沒有命中任何 ...


SELECT COUNT(*) FROM table_name是個再常見不過的統計需求了。
本文帶你瞭解下MysqlCOUNT函數。

一、COUNT函數

關於COUNT函數,在MySQL官網中有詳細介紹

風塵博客

翻譯一下:

  1. COUNT(expr) ,返回SELECT語句檢索的行中expr的值不為NULL的數量,結果是一個BIGINT值。
  2. 如果查詢結果沒有命中任何記錄,則返回0
  3. COUNT(*) 的統計結果中,會包含值為NULL的行數。

《阿裡巴巴Java開發手冊》也有如下要求:

風塵博客

二、COUNT(列名)COUNT(常量)COUNT(*)

前面我們提到過COUNT(expr)用於做行數統計,那麼COUNT(列名)COUNT(常量)COUNT(*)這三種語法中,expr分別是列名、 常量 和 *

2.1 COUNT(*)COUNT(常量)

在列名、常量和*這三個條件中,常量是一個固定值,肯定不為NULL*可以理解為查詢整行,所以肯定也不為NULL,那麼就只有列名的查詢結果可能是NULL

所以, COUNT(常量)COUNT(*)表示的是直接查詢符合條件的資料庫表的行數。而COUNT(列名)表示的是查詢符合條件的列的值不為NULL的行數。

2.2 COUNT(*)COUNT(1)區別

COUNT(1)就是COUNT(常量),對於這二者到底有沒有區別:

  1. 有的說COUNT(*)執行時會轉換成COUNT(1),所以COUNT(1)少了轉換步驟,所以更快。
  2. 還有的說,因為MySQL針對COUNT(*)做了特殊優化,所以COUNT(*)更快。

到底哪種說法是對的?看下MySQL官方文檔:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

通過文檔,對於COUNT(1)COUNT(*)MySQL的優化是完全一樣的,根本不存在誰比誰快!

2.3 COUNT(列名)

相較於前兩者,COUNT(列名)的查詢就比較簡單粗暴了,就是進行全表掃描,然後判斷指定欄位的值是不是為NULL,不為NULL則累加。

相比COUNT(*)COUNT(列名)多了一個步驟就是判斷所查詢的欄位是否為NULL,所以他的性能要比COUNT(*)慢。
here和group的條件查詢。

2.4 SQL92

除了查詢得到結果集有區別之外,COUNT(*)相比COUNT(常量)COUNT(列名)來講,COUNT(*)SQL92定義的標準統計行數的語法,因為他是標準語法,所以MySQL資料庫對他進行過很多優化。

SQL92,是資料庫的一個ANSI/ISO標準。它定義了一種語言(SQL)以及資料庫的行為(事務、隔離級別等)。

2.5 COUNT(*)優化

因為COUNT(*)SQL92定義的標準統計行數的語法,所以MySQL對其進行了很多優化:

  1. MyISAM中會直接把表的總行數單獨記錄下來供COUNT(*)查詢
  2. InnoDB會在掃表的時候選擇最小的索引來降低成本。

這些優化的前提都是沒有進行wheregroup的條件查詢,更多請參考MySQL 全表 COUNT(*) 簡述

三、總結

COUNT函數用於統計表行數,按照效率比較的話:

count(*)=count(常量)>count(列名)

3.1 小建議

既然 count(*) 在查詢上依賴於所有的數據集,所以我們在設計上也需要儘量的規避全量 count

通常情況我們針對可預見count 查詢會做適當的緩存,可以是 Redis,也可以是獨立的 MySQL count 表。

3.2 技術交流

  1. 風塵博客
  2. 風塵博客-掘金
  3. 風塵博客-博客園
  4. Github

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Equals和GetHashCode Equals每個實現都必須遵循以下約定: 自反性(Reflexive): x.equals(x)必須返回true. 對稱性(Symmetric): x.equals(y)為true時,y.equals(x)也為true. 傳遞性(Transitive): 對於任 ...
  • (1)切換到目錄 /usr/bin; (2)查看目錄/usr/local 下所有的文件; (3)進入/usr 目錄,創建一個名為 test 的目錄,並查看有多少目錄存在; (4)在/usr 下新建目錄 test1,再複製這個目錄內容到/tmp; (5)將上面的/tmp/test1 目錄重命名為 te ...
  • 在 Docker 官網查閱 API 調用方式 例如: "查詢正在運行的容器列表" ,HTTP 方式如下: 分析 API 請求的過程 在本機執行如下命令 Java 模擬調用 API 的代碼實現 1、引入 UnixSocket 工具包 2、測試代碼 相關文檔 "Docker API 文檔" 本文由博客一 ...
  • 背景 By 魯迅 By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器,Contex A53,雙核 3. 使用工具:Source Insight 3.5, Visio 1. 概述 從這篇文章開始,將開始Linux調度器的系列研究了。 本文也會從一些基礎的概念及數據結構入手, ...
  • 續上一篇隨筆:https://www.cnblogs.com/kingstarer/p/11355612.html《工作碰上的技術問題及處理經驗》(三) 我這人記憶力比較差,經常出現有些知識學了不久後就忘了,或者有些問題花了很多時間百度解決後,再過一段時間碰上時只有模糊印象,卻忘了具體解決方法。 最 ...
  • 1. 出現此類問題的原因 由於原visual studio文件中的安裝中出現問題,所以原有的SDK(soft development kits)文件出現缺失; 2. 解決方法1 重新下載SDK工具,安裝; 3. 解決方法2 修複visual studio2013,安裝SDK工具; 4. 解決方法3 ...
  • 運行作業界面在以下界面中,可以查看到作業的名稱、作業的啟動時間、作業總計運行時長、作業一共有多少個任務、當前正在運行多少個任務、以及作業的當前狀態。這裡的程式:一共有17個任務,當前正在運行的是17個任務。作業概覽界面在這個界面中,我們可以看到數據流圖。這個程式中,一共有3個運算元。Custom So... ...
  • Spark SQL可以使用JDBC/ODBC或命令行介面充當分散式查詢引擎。這種模式,用戶或者應用程式可以直接與Spark SQL交互,以運行SQL查詢,無需編寫任何代碼。Spark SQL提供兩種方式來運行SQL:通過運行Thrift Server直接執行Spark SQL命令行運行Thrift ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...