最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL Count函數(shù)使用教程

 更新時(shí)間:2022年12月12日 15:15:23   作者:愛吃南瓜糕的北絡(luò)  
這篇文章主要介紹了MySQL Count函數(shù),COUNT()是一個(gè)聚合函數(shù),返回指定匹配條件的行數(shù)。開發(fā)中常用來統(tǒng)計(jì)表中數(shù)據(jù),全部數(shù)據(jù),不為NULL數(shù)據(jù),或者去重?cái)?shù)據(jù)

COUNT 是一個(gè)匯總函數(shù)(聚集函數(shù)),它接受一個(gè)表達(dá)式作為參數(shù):

COUNT(expr)

COUNT函數(shù)用于統(tǒng)計(jì)在符合搜索條件的記錄中,指定的表達(dá)式expr不為NULL的行數(shù)有多少。這里需要特別注意的是,expr不僅僅可以是列名,其他任意表達(dá)式都是可以的。

一、COUNT 的使用

select COUNT(key1) FROM t;

這個(gè)語(yǔ)句是用于統(tǒng)計(jì)在 t 表 key1 列 值不為 NULL 的行數(shù)是多少。

看下面的這個(gè):

select COUNT('abc') FROM t;

這個(gè)語(yǔ)句是用于統(tǒng)計(jì)在 t 表的所有記錄中,‘abc’ 這個(gè)表達(dá)式不為 NULL的行數(shù)是多少。很顯然,‘abc’ 這個(gè)表達(dá)式永遠(yuǎn)不為 NULL, 所以上述語(yǔ)句其實(shí)就是統(tǒng)計(jì) t 表里有多少條記錄。

再看這個(gè):

select COUNT(*) from t;

這個(gè)語(yǔ)句就是直接統(tǒng)計(jì) t 表中有多少條記錄。

總結(jié) + 注意:COUNT函數(shù)的參數(shù)可以是任意表達(dá)式, 該函數(shù)用于統(tǒng)計(jì)在符合搜索條件的記錄中,指定的表達(dá)式不為NULL的行數(shù)有多少。

二、COUNT是怎么樣運(yùn)行的

mysql> select count(*) from single_table;
+----------+
| count(*) |
+----------+
|    12610 |
+----------+
1 row in set (0.00 sec)
####### single_table 表結(jié)構(gòu) ########
CREATE TABLE `single_table` (
  `id` int NOT NULL AUTO_INCREMENT,
  `key1` varchar(100) DEFAULT NULL,
  `key2` int DEFAULT NULL,
  `key3` varchar(100) DEFAULT NULL,
  `key_part1` varchar(100) DEFAULT NULL,
  `key_part2` varchar(100) DEFAULT NULL,
  `key_part3` varchar(100) DEFAULT NULL,
  `common_field` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_key2` (`key2`),
  KEY `idx_key1` (`key1`),
  KEY `idx_key3` (`key3`),
  KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`)
) ENGINE=InnoDB AUTO_INCREMENT=20000 DEFAULT CHARSET=utf8mb3 |

這個(gè)語(yǔ)句是要去查詢表 single_table 中共包含多少條記錄。由于聚簇索引和二級(jí)索引中的記錄是一一對(duì)應(yīng)的,而二級(jí)索引記錄中包含的列是少于聚簇索引記錄的,所以同樣數(shù)量的二級(jí)索引記錄可以比聚簇索引記錄占用更少的存儲(chǔ)空間。如果我們使用二級(jí)索引執(zhí)行上述查詢,即數(shù)一下idx_key2中共有多少條二級(jí)索引記錄(存在多個(gè)二級(jí)索引,為什么選擇idx_key2,下面會(huì)具體說明),是比直接數(shù)聚簇索引中共有多少聚簇索引記錄可以節(jié)省很多I/O成本。所以優(yōu)化器會(huì)決定使用idx_key2執(zhí)行上述查詢。

mysql> explain select count(*) from single_table;
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

在執(zhí)行上述查詢時(shí),server層會(huì)維護(hù)一個(gè)名叫count的變量,然后:

(1)server層向InnoDB要第一條記錄。

(2)InnoDB找到idx_key1的第一條二級(jí)索引記錄,并返回給server層(注意:由于此時(shí)只是統(tǒng)計(jì)記錄數(shù)量,所以并不需要回表)。

(3)由于COUNT函數(shù)的參數(shù)是*,MySQL會(huì)將*當(dāng)作常數(shù)0處理。由于0并不是NULL,server層給count變量加1。

(4)server層向InnoDB要下一條記錄。

(5)InnoDB通過二級(jí)索引記錄的next_record屬性找到下一條二級(jí)索引記錄,并返回給server層。

(6)server層繼續(xù)給count變量加1。

(7)... 重復(fù)上述過程,直到InnoDB向server層返回沒記錄可查的消息。

(8)server層將最終的count變量的值發(fā)送到客戶端。

三、COUNT函數(shù)的索引使用情況

下面我們?cè)鰧?duì) count(*),count(1),count(常數(shù)),count(主鍵列),count(普通列(有索引)),count(普通列(無索引))

(1)count(*),count(1),count(常數(shù))

mysql> show create table single_table;
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| single_table | CREATE TABLE `single_table` (
  `id` int NOT NULL AUTO_INCREMENT,
  `key1` varchar(100) DEFAULT NULL,
  `key2` int DEFAULT NULL,
  `key3` varchar(100) DEFAULT NULL,
  `key_part1` varchar(100) DEFAULT NULL,
  `key_part2` varchar(100) DEFAULT NULL,
  `key_part3` varchar(100) DEFAULT NULL,
  `common_field` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_key2` (`key2`),
  KEY `idx_key1` (`key1`),
  KEY `idx_key3` (`key3`),
  KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`)
) ENGINE=InnoDB AUTO_INCREMENT=20000 DEFAULT CHARSET=utf8mb3 |
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select count(*) from single_table;
+----------+
| count(*) |
+----------+
|    12610 |
+----------+
1 row in set (0.00 sec)
## count(*) 采用了 idx_key2 索引
mysql> explain select count(*) from single_table;
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
## count(1) 采用了 idx_key2 索引
mysql> explain select count(1) from single_table;
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
## count('abc') 采用了 idx_key2 索引
mysql> explain select count('abc') from single_table;
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

通過上述查詢結(jié)果可以看出:

count(*)、count(1)、count('abc') 均采用了 idx_key2,而索引idx_key2 對(duì)應(yīng)的索引列為 key2,字段類型為 int,占用空間為最小的索引列。

結(jié)論:

對(duì)于 COUNT(*)、COUNT(1) 或者任意的 COUNT(常數(shù)) 來說,讀取哪個(gè)索引的記錄其實(shí)并不重要,因?yàn)閟erver層只關(guān)心存儲(chǔ)引擎是否讀到了記錄,而并不需要從記錄中提取指定的字段來判斷是否為NULL。所以優(yōu)化器會(huì)使用占用存儲(chǔ)空間最小的那個(gè)索引來執(zhí)行查詢。

(2)count(主鍵列)

## count(id) 采用了 idx_key2 索引
mysql> explain select count(id) from single_table;
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

通過上述查詢結(jié)果可以看出:

count(id)采用了 idx_key2,而索引idx_key2 對(duì)應(yīng)的索引列為 key2,字段類型為 int,占用空間為最小的索引列。

結(jié)論:

對(duì)于 COUNT(id) 來說,由于id是主鍵,不論是聚簇索引記錄,還是任意一個(gè)二級(jí)索引記錄中都會(huì)包含主鍵字段,所以其實(shí)讀取任意一個(gè)索引中的記錄都可以獲取到id字段,此時(shí)優(yōu)化器也會(huì)選擇占用空間最小的那個(gè)索引來執(zhí)行查詢。

(3)count(普通列(有索引))

## count('key1') 采用了 idx_key1 索引
mysql> explain select count(key1) from single_table;
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key1 | 303     | NULL | 12590 |   100.00 | Using index |
+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
## count(common_field) 未采用任何索引
mysql> explain select count(common_field) from single_table;
+----+-------------+--------------+------------+------+---------------+------+---------+------+-------+----------+-------+
| id | select_type | table        | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra |
+----+-------------+--------------+------------+------+---------------+------+---------+------+-------+----------+-------+
|  1 | SIMPLE      | single_table | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 12590 |   100.00 | NULL  |
+----+-------------+--------------+------------+------+---------------+------+---------+------+-------+----------+-------+
1 row in set, 1 warning (0.00 sec)

通過上述查詢結(jié)果可以看出:

count(key1)采用了 idx_key1,索引idx_key1對(duì)應(yīng)的索引列即為key1。count(common_field)未采用任何索引,common_field也不存在任何索引。

結(jié)論:

對(duì)于COUNT(非主鍵列)來說,我們指定的列可能并不會(huì)包含在每一個(gè)索引中。這樣優(yōu)化器只能選擇包含我們指定的列的索引去執(zhí)行查詢,這就可能導(dǎo)致優(yōu)化器選擇的索引并不是最小的那個(gè)。

四、補(bǔ)充

對(duì)于count(非空普通列)來說,使用索引情況會(huì)怎么樣?會(huì)不會(huì)直接采用最小占用空間索引呢?

mysql> show create table person_info;
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                                                                                                                                                                                     |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| person_info | CREATE TABLE `person_info` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `birthday` date NOT NULL,
  `age` int DEFAULT NULL,
  `phone_number` char(11) NOT NULL,
  `country` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`),
  KEY `idx_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3 |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> explain select count(phone_number) from person_info;
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table       | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | person_info | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    9 |   100.00 | NULL  |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

通過上述查詢結(jié)果可以看出:

雖然 phone_number 字段為 not null,count(phone_number) 和 count(*) 結(jié)果一致,但是 phone_number 仍然并有選擇走索引。

五、總結(jié)

(1)對(duì)于COUNT(*)、COUNT(常數(shù))、COUNT(主鍵) 形式的COUNT函數(shù)來說,優(yōu)化器可以選擇最小索引執(zhí)行查詢,從而提升效率,它們的執(zhí)行過程是一樣的,只不過在判斷表達(dá)式是否為NULL時(shí)選擇不同的判斷方式,這個(gè)判斷為NULL的過程的代價(jià)可以忽略不計(jì),所以我們可以認(rèn)為 COUNT(*)、COUNT(常數(shù))、COUNT(主鍵) 所需要的代價(jià)是相同的。

(2)對(duì)于 COUNT(非主鍵列) 來說,server層必須要從InnoDB中讀到包含非主鍵列的記錄,所以優(yōu)化器并不能隨心所欲的選擇占用空間最小的索引去執(zhí)行。

到此這篇關(guān)于MySQL Count函數(shù)使用教程的文章就介紹到這了,更多相關(guān)MySQL Count內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL查看用戶權(quán)限及權(quán)限管理的方法詳解

    MySQL查看用戶權(quán)限及權(quán)限管理的方法詳解

    在MySQL中,查看用戶權(quán)限可以通過多種方式實(shí)現(xiàn),主要取決于我們想要查看的權(quán)限類型和詳細(xì)程度,本文給大家介紹了MySQL查看用戶權(quán)限及權(quán)限管理的方法,并通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Mysql合并結(jié)果接橫向拼接字段的實(shí)現(xiàn)步驟

    Mysql合并結(jié)果接橫向拼接字段的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了關(guān)于Mysql合并結(jié)果接橫向拼接字段的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • mysql too many open connections問題解決方法

    mysql too many open connections問題解決方法

    這篇文章主要介紹了mysql too many open connections問題解決方法,其實(shí)是max_connections配置問題導(dǎo)致,它必須在[mysqld]下面才會(huì)生效,需要的朋友可以參考下
    2014-05-05
  • MySQL中定時(shí)器的底層實(shí)現(xiàn)原理及使用方法

    MySQL中定時(shí)器的底層實(shí)現(xiàn)原理及使用方法

    定時(shí)器可以用于定期執(zhí)行特定的SQL語(yǔ)句、備份數(shù)據(jù)、生成報(bào)表等操作,本文將詳細(xì)介紹MySQL中定時(shí)器的底層實(shí)現(xiàn)機(jī)制以及如何使用它
    2023-07-07
  • mysql 8.0.22 下載安裝配置方法圖文教程

    mysql 8.0.22 下載安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.22 下載安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • MySQL中的臨時(shí)表與內(nèi)存表

    MySQL中的臨時(shí)表與內(nèi)存表

    這篇文章主要介紹了MySQL中的臨時(shí)表與內(nèi)存表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL中日期格式化匹配的處理方式

    MySQL中日期格式化匹配的處理方式

    處理日期和時(shí)間數(shù)據(jù)是很常見的需求,本文主要介紹了SELECT?語(yǔ)句對(duì)日期進(jìn)行格式化匹配,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 在MySQL數(shù)據(jù)庫(kù)中使用C執(zhí)行SQL語(yǔ)句的方法

    在MySQL數(shù)據(jù)庫(kù)中使用C執(zhí)行SQL語(yǔ)句的方法

    與PostgreSQL相似,可使用許多不同的語(yǔ)言來訪問MySQL,包括C、C++、Java和Perl。從Professional Linux Programming中第5章有關(guān)MySQL的下列章節(jié)中,Neil Matthew和Richard Stones使用詳盡的MySQL C接口向我們介紹了如何在MySQL數(shù)據(jù)庫(kù)中執(zhí)行SQL語(yǔ)句。
    2012-10-10
  • MySQL數(shù)據(jù)庫(kù)下用戶及用戶權(quán)限配置

    MySQL數(shù)據(jù)庫(kù)下用戶及用戶權(quán)限配置

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)下用戶及用戶權(quán)限配置的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • 深入淺析MySQL從刪庫(kù)到跑路_高級(jí)(一)——數(shù)據(jù)完整性

    深入淺析MySQL從刪庫(kù)到跑路_高級(jí)(一)——數(shù)據(jù)完整性

    數(shù)據(jù)完整性是指數(shù)據(jù)的可靠性和準(zhǔn)確性,數(shù)據(jù)完整性類型有四種,本文給大家提到,接下來通過本文給大家介紹MySQL從刪庫(kù)到跑路的內(nèi)容分析,感興趣的朋友跟隨小編一起看看吧
    2018-11-11

最新評(píng)論

内黄县| 福泉市| 刚察县| 紫云| 淮南市| 凤凰县| 霍城县| 瓦房店市| 韶关市| 胶州市| 盱眙县| 肥西县| 咸阳市| 宜宾县| 宣化县| 临夏市| 衡山县| 清远市| 霍邱县| 阜新| 汶上县| 大兴区| 和平区| 旬邑县| 务川| 台北市| 遂昌县| 洪江市| 泸西县| 称多县| 锡林郭勒盟| 潞城市| 盖州市| 商都县| 绥滨县| 修武县| 综艺| 运城市| 金乡县| 陆丰市| 沾益县|