偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊MySQL的COUNT的性能,看看怎么最快?

數(shù)據(jù)庫 MySQL
這篇文章主要介紹了聊聊MySQL的COUNT(*)的性能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

[[400316]]

前言

基本職場(chǎng)上的程序員用來統(tǒng)計(jì)數(shù)據(jù)庫表的行數(shù)都會(huì)使用count(*),count(1)或者count(主鍵),那么它們之間的區(qū)別和性能你又是否了解呢?

其實(shí)程序員在開發(fā)的過程中,在一張大表上統(tǒng)計(jì)總行數(shù)是非常耗時(shí)的一個(gè)操作,那么我們應(yīng)該用哪個(gè)方法統(tǒng)計(jì)會(huì)更快呢?

接下來我們就來聊一聊MySQL中統(tǒng)計(jì)總行數(shù)的方法和性能。

count(*),count(1),count(主鍵)哪個(gè)更快?

1、建表并且插入1000萬條數(shù)據(jù)進(jìn)行實(shí)驗(yàn)測(cè)試:

  1. # 創(chuàng)建測(cè)試表 
  2. CREATE TABLE `t6` ( 
  3.  `id` int(11) NOT NULL AUTO_INCREMENT, 
  4.  `namevarchar(50) NOT NULL
  5.  `status` tinyint(4) NOT NULL
  6.  PRIMARY KEY (`id`), 
  7.  KEY `idx_status` (`status`) 
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  9.   
  10. # 創(chuàng)建存儲(chǔ)過程插入1000w數(shù)據(jù) 
  11. CREATE PROCEDURE insert_1000w() 
  12. BEGIN 
  13.   DECLARE i INT
  14.   SET i=1; 
  15.   WHILE i<=10000000 DO 
  16.     INSERT INTO t6(name,status) VALUES('god-jiang-666',1); 
  17.     SET i=i+1; 
  18.   END WHILE; 
  19. END
  20.   
  21. #調(diào)用存儲(chǔ)過程,插入1000萬行數(shù)據(jù) 
  22. call insert_1000w(); 

2、分析實(shí)驗(yàn)結(jié)果

  1. # 花了0.572秒 
  2. select count(*) from t6; 

 

在這里插入圖片描述

  1. # 花了0.572秒 
  2. select count(1) from t6; 

 

  1. # 花了0.580秒 
  2. select count(id) from t6; 

 

  1. # 花了0.620秒 
  2. select count(*) from t6 force index (primary); 

 

從上面的實(shí)驗(yàn)我們可以得出,count(*)和count(1)是最快的,其次是count(id),最慢的是count使用了強(qiáng)制主鍵的情況。

下面我們繼續(xù)測(cè)試一下它們各自的執(zhí)行計(jì)劃:

  1. explain select count(*) from t6; 
  2. show warnings; 

 

  1. explain select count(1) from t6; 
  2. show warnings; 

 

  1. explain select count(id) from t6; 
  2. show warnings; 

 

  1. explain select count(*) from t6 force index (primary); 
  2. show warnings; 

 

從上面的實(shí)驗(yàn)可以得出這三點(diǎn):

  1. count(*)被MySQL查詢優(yōu)化器改寫成了count(0),并選擇了idx_status索引
  2. count(1)和count(id)都選擇了idx_statux索引
  3. 加了force index(primary)之后,走了強(qiáng)制索引

這個(gè)idx_status就是相當(dāng)于是二級(jí)輔助索引樹,目的就是為了說明:InnoDB在處理count(*)的時(shí)候,有輔助索引樹的情況下,會(huì)優(yōu)先選擇輔助索引樹來統(tǒng)計(jì)總行數(shù)。

為了驗(yàn)證count(*)會(huì)優(yōu)先選擇輔助索引樹這個(gè)結(jié)論,我們繼續(xù)來看看下面的實(shí)驗(yàn):

  1. # 刪除idx_status索引,繼續(xù)執(zhí)行count(*) 
  2. alter table t6 drop index idx_status; 
  3.  
  4. explain select count(*) from t6; 

 

從以上實(shí)驗(yàn)可以得出,刪除了idx_status這個(gè)輔助索引樹,count(*)就會(huì)選擇走主鍵索引。所以結(jié)論:count(*)會(huì)優(yōu)先選擇輔助索引,假如沒有輔助索引的存在,就會(huì)走主鍵索引。

為什么count(*)會(huì)優(yōu)先選擇輔助索引?

在MySQL5.7.18之前,InnoDB通過掃描聚集索引來處理count(*)語句。

從MySQL5.7.18開始,InnoDB通過遍歷最小的可用二級(jí)索引來處理count(*)語句。如果不存在二級(jí)索引,則掃描聚集索引。

新版本為何會(huì)使用二級(jí)索引來處理count(*)呢?

因?yàn)镮nnoDB二級(jí)索引樹的葉子節(jié)點(diǎn)上存放的是主鍵,而主鍵索引樹的葉子節(jié)點(diǎn)存放的是整行數(shù)據(jù),所以二級(jí)索引樹比主鍵索引樹小。因此查詢優(yōu)化器基于成本考慮,優(yōu)先選擇的是二級(jí)索引。所以索引count(*)快于count(主鍵)。

總結(jié)

這篇文章的結(jié)論就是count(*)=count(1)>count(id)。

為什么count(id)走了主鍵索引還會(huì)更慢呢?因?yàn)閏ount(id)需要取出主鍵,然后判斷不為空,再累加,代價(jià)更高。

count(*)是會(huì)總計(jì)出所有NOT NULL和NULL的字段,而count(id)是不會(huì)統(tǒng)計(jì)NULL字段的,所以我們?cè)诮ū淼谋M量使用NOT NULL并且給它一個(gè)默認(rèn)是空即可。

最后,在以后總計(jì)數(shù)據(jù)庫表的總行數(shù)的時(shí)候,可以大膽的使用count(*)或者count(1)。

參考資料

  • 《高性能MySQL》(第三版)第六章優(yōu)化COUNT()查詢
  • 《MySQL實(shí)戰(zhàn)45講》林曉斌

 

責(zé)任編輯:姜華 來源: 愛寫B(tài)ug的麥洛
相關(guān)推薦

2021-12-02 07:02:16

API性能設(shè)計(jì)

2020-11-11 10:00:13

NAT性能內(nèi)核

2018-07-19 08:49:47

Python編程語言測(cè)評(píng)

2022-07-27 14:24:38

MySQL數(shù)據(jù)庫SQL

2020-06-10 08:28:51

Kata容器I

2015-05-19 09:28:17

網(wǎng)速

2009-03-22 19:19:15

多核多核服務(wù)器多核歷史

2022-11-17 00:04:38

接口性能查詢

2023-06-12 09:09:19

MySQLDDLNSTANT

2021-11-17 08:11:35

MySQL

2023-11-09 11:56:28

MySQL死鎖

2023-07-12 13:08:58

性能測(cè)試數(shù)據(jù)

2024-02-29 18:06:39

HTTP性能優(yōu)化

2024-05-31 09:31:00

2022-11-26 08:16:26

2022-04-02 10:23:12

MySQL數(shù)據(jù)庫

2021-11-18 08:20:22

接口索引SQL

2022-03-11 10:23:02

React性能優(yōu)化

2015-06-25 12:41:53

實(shí)時(shí) Node應(yīng)用性能監(jiān)測(cè)

2021-06-02 10:00:30

云網(wǎng)絡(luò)性能測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)