count()聚合函數正確用法

来源:https://www.cnblogs.com/liyingxiao/archive/2019/04/23/10754671.html
-Advertisement-
Play Games

count()是聚合函數,對於返回的結果集,一行行地判斷,累計值加1,最後返回累計值,count(*)、count(主鍵ID)和count(1)表示返回滿足條件的結果集的總行數。 count()聚合函數統計非NULL與NULL值的區別: 1、count(欄位)不統計NULL記錄,即表示滿足條件的數據 ...


count()聚合計算

  count()是聚合函數,對於返回的結果集,一行行地判斷,累計值加1,最後返回累計值,count(*)、count(主鍵ID)和count(1)表示返回滿足條件的結果集的總行數。

count()聚合函數統計非NULL與NULL值的區別:

  1、count(欄位)不統計NULL記錄,即表示滿足條件的數據行里參數欄位不為NULL的行

  2、count(1)和count(*)會記錄NULL值

count(主鍵ID)、count(欄位)、count(1)、count(*)的區別和性能差異(分析性能差別的原則)   1、server層要什麼就給什麼    2、InnoDB只給必要的值   3、現在的優化器對count(*)的取行數做了優化,其他沒有做優化   count(主鍵ID)比count(1)慢的原因   對於 count(主鍵 ID) 來說,InnoDB 引擎會遍歷主鍵索引樹,把每一行的ID值取出來,返回給server層,server層拿到ID後,判斷是不可能為空的,按行累加加1,最後返回累計值。   對於count(1),InnoDB引擎會掃描主鍵索引樹,但不取值,server層對於返回的每一行,按行累計加1,判斷不可能為NULL,返回累計值。   從InnoDB引擎層返回ID會涉及到解析數據行、拷貝欄位值的操作,因此count(主鍵 ID)執行要比count(1)執行慢。   count(欄位)   1、如果這個欄位定義為not null的話,一行行地從記錄裡面讀出這個欄位,判斷不能為null,按行累計加1   2、如果這個欄位定義允許為null,一行行地從記錄裡面讀出這個欄位,執行的時候還要判斷是否為null,不為null的按行累計加1,返回累加值    count(主鍵id)走主鍵索引的時候效率較count(*)差的原因?
  平時我們檢索一列的時候,基本上等值或範圍查詢,那麼索引基數大的索引必然效率很高(符合走主鍵索引查找速度最快的原則)。   但是在做count(*)的時候並沒有檢索具體的一行或者一個範圍,那麼選擇基數小的索引對count操作效率會更高。在做count操作的時候,mysql會遍歷每個葉子節點,所以基數越小,效率越高。mysql非聚簇索引葉子節點保存指向主鍵ID的指針,所以需要檢索兩遍索引。但是這裡相對於遍歷主鍵索引,即使檢索兩遍索引效率也比單純的檢索主鍵索引快。   Innodb是索引組織表,主鍵索引樹的葉子節點是數據,而普通索引樹的葉子節點是主鍵值,索引普通索引樹小很多,索引長度越小樹的大小就越小。   MyISAM與InnoDB,正如在不同的存儲引擎中,count(*)函數的執行是不同的   在MyISAM存儲引擎中,count()函數是直接讀取數據表保存的行記錄數並返回,效率很高,但是如果添加了where條件的話,MyISAM表也不能返回得很快。
  在InnoDB存儲引擎中,count(*)函數是先從記憶體中讀取表中的數據到記憶體緩衝區,然後掃描全表獲得行記錄數。在使用count函數中加上where條件時,在兩個存儲引擎中的效果是一樣的,都會掃描全表計算某欄位有值項的次數。
count(*)中關於select count(*) from tab_name幾種不走索引和走那種索引情景分析
CREATE TABLE `t1` (
  `c1` varchar(30) NOT NULL,
  `c2` varchar(20) NOT NULL,
  `c3` varchar(40) NOT NULL,
  `c4` varchar(10) DEFAULT NULL)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ceshi_count'
1、表中沒有任何索引(表也沒有主鍵)
mysql> explain select count(*) from t1;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.01 sec)
2、表有主鍵則執行主鍵索引全掃描
mysql> alter table t1 add primary key (c1);
Query OK, 0 rows affected (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select count(*) from t1;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra      |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | PRIMARY | 92      | NULL |    1 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)
3、表有二級索引,則使用二級索引key_len最小的索引進行掃描,儘管這個二級索引的key_len的值大於主鍵,都使用二級索引
mysql> alter table t1 add index idx_c3(c3);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select count(*) from t1;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | idx_c3 | 122     | NULL |    1 | Using index |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
1 row in set (0.00 sec)

4、表有多個二級索引,則使用key_len小的二級索引進行掃描

mysql> alter table t1 add index idx_t1_c4(c4);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select count(*) from t1;
+----+-------------+-------+-------+---------------+-----------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows | Extra      |
+----+-------------+-------+-------+---------------+-----------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | idx_t1_c4 | 33      | NULL |    1 | Using index |
+----+-------------+-------+-------+---------------+-----------+---------+------+------+-------------+
1 row in set (0.00 sec)
取表行數的幾種方式
  1、count(*)取行數
  2、通過infomation_schema可以快速拿到表的count值,但不是一個準確的值,通過show table status like 'tab_name'查找到的table rows是通過採樣方式得到行數,它的誤差率達到了40到50%,
  3、MyISAM會存儲具體的行數(可能因為myISAM事務要加表鎖,才這樣設計),InnoDB則需要進行全表掃描

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

-Advertisement-
Play Games
更多相關文章
  • --語 句 功 能--數據操作SELECT --從資料庫表中檢索數據行和列INSERT --向資料庫表添加新數據行DELETE --從資料庫表中刪除數據行UPDATE --更新資料庫表中的數據 --數據定義 CREATE TABLE --創建一個資料庫表DROP TABLE --從資料庫中刪除表 A ...
  • 由於資料庫存的是整個字元串組到一起了,C#代碼是這個樣子的。 在sqlserver中存儲的實際值是:20190416124941。那麼直接轉換? 所以在sqlserver中查詢的時候我們要進行轉化,因為在mssql中進行轉換需要是有標準的 例如/ : 等符號。那麼我們就進行截取吧。 最後就完事了。 ...
  • 加鎖的主要目的是為了防止併發操作時導致的數據不一致等問題,鎖分為共用鎖(S)、更新鎖(U)、排他鎖(X),共用鎖與更新只是單向相容?傳說中的單相思? 事務 事務能保證數據操作的原子性,要麼內部操作都提交,要麼都回退。事務內部某個地方出錯時,可以回滾前面的操作,比如更新、刪除等。 共用鎖 共用鎖允許並 ...
  • 在資料庫的鎖機制中介紹過,資料庫管理系統(DBMS)中的併發控制的任務是確保在多個事務同時存取資料庫中同一數據時不破壞事務的隔離性和統一性以及資料庫的統一性。 樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段。 無論是悲觀鎖還是樂觀鎖,都是人們定義出來的概念,可以認為是一種 ...
  • 一、統計語句 1、--統計當前【>當天00點以後的數據】 SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111) ORDER BY dateandtime DESC 2 ...
  • 安裝redis-5.0.4 修改配置文件 創建命令鏈接 設置redis開機自啟動 啟動redis服務 測試連接 安裝過程可能出現的問題 1.CentOS預設沒有安裝gcc,這會導致我們無法make成功 2.make時報如下錯誤: zmalloc.h:50:31: fatal error: jemal ...
  • [20190423]那個更快的疑問3.txt--//前一陣子,做了11g在單表單條記錄唯一索引掃描的測試,摘要如下:--//參考鏈接:http://blog.itpub.net/267265/viewspace-2636321/http://blog.itpub.net/267265/viewspa ...
  • 【問題描述】 開發反饋,有一個SQL Server數據同步的作業,從Table1 拉取數據,主鍵是ID, 每次拉取批次數據的SQL語句是 select top (15) from Table1(NOLOCK) where ID ?,?代表的是上次同步批次中最後一個ID號。 某一次拉取到的數據為 ID ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...