mysql技巧之select count的區(qū)別分析
1.測(cè)試環(huán)境
OS:Linux
DB:mysql-5.5.18
table:innodb存儲(chǔ)引擎
表定義如下:

2. 測(cè)試場(chǎng)景與分析【統(tǒng)計(jì)表group_message的記錄數(shù)目】
(1)select count(*)方式

(2)select count(1)方式

(3)select count(col_name)方式
分別使用
select count(group_id)
select count(user_id)
select count(col_null)

通過(guò)上述測(cè)試結(jié)果可以看到,select count(*)和select count(1)都使用了group_id這個(gè)最短的二級(jí)索引??赡苡腥藭?huì)問(wèn)為啥不用更短的主鍵索引【int類型】呢,這主要是因?yàn)閕nnodb存儲(chǔ)引擎下,主鍵索引實(shí)質(zhì)包含了索引和數(shù)據(jù),掃描主鍵索引實(shí)際是掃描物理記錄,代價(jià)實(shí)質(zhì)是最大的。再來(lái)看看幾種select count(col_name), count(group_id)使用了最短二級(jí)索引,因?yàn)樵摿芯褪撬饕校欢鴆ount(user_id)則使用了組合索引,由于user_id實(shí)質(zhì)不能利用該索引,但掃描索引也能得到記錄數(shù),而且比掃描物理記錄代價(jià)小,這里應(yīng)該是mysql的一個(gè)優(yōu)化;count(col_null)則不能使用索引,因?yàn)樵摿泻衝ull值,所以效率最低。另外,對(duì)于含有null值的行,count(col_null)實(shí)際不會(huì)統(tǒng)計(jì),這會(huì)與你想統(tǒng)計(jì)表記錄數(shù)目的初衷不符,比如測(cè)試表有852226條記錄,但col_null列只有1行非空,則統(tǒng)計(jì)結(jié)果如下:

3.測(cè)試結(jié)論
mysql中,需要通過(guò)selct count 統(tǒng)計(jì)表記錄數(shù)目時(shí),使用count(*)或count(1)就好。
- MySQL select、insert、update批量操作語(yǔ)句代碼實(shí)例
- 解決MySQL讀寫分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題
- MySQL將select結(jié)果執(zhí)行update的實(shí)例教程
- MySQL之select、distinct、limit的使用
- 為什么MySQL不建議使用SELECT?*
- MySQL運(yùn)行報(bào)錯(cuò):“Expression?#1?of?SELECT?list?is?not?in?GROUP?BY?clause?and?contains?nonaggre”解決方法
- MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案
相關(guān)文章
winx64下mysql5.7.19的基本安裝流程(詳細(xì))
這篇文章主要介紹了winx64下mysql5.7.19的基本安裝流程,需要的朋友可以參考下2017-10-10
詳解在Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了如何Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
MYSQL 隨機(jī) 抽取實(shí)現(xiàn)方法及效率分析
MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法。舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。2009-05-05
MySQL同步ES(Elasticsearch)的四種常見方案分享
MySQL和Elasticsearch(ES)是兩個(gè)非常重要的數(shù)據(jù)存儲(chǔ)和搜索技術(shù),MySQL是一種關(guān)系型數(shù)據(jù)庫(kù),而ES則是一種文檔型數(shù)據(jù)庫(kù),在許多情況下,我們需要將MySQL中的數(shù)據(jù)同步到ES中,本文將介紹四種常見的MySQL同步ES方案,需要的朋友可以參考下2023-07-07
MySQL的prepare使用及遇到bug解析過(guò)程
在一次開發(fā)中使用 MySQL PREPARE 以后,從 prepare 直接取 name 賦值給 lex->prepared_stmt_name 然后給 EXECUTE 用,發(fā)現(xiàn)有一定概率找不到 prepare stmt 的 name,于是開始動(dòng)手調(diào)查問(wèn)題發(fā)生的原因,本文給大家分享mysql prepare使用及問(wèn)題解決,感興趣的朋友一起看看吧2022-05-05
MySQL 中 blob 和 text 數(shù)據(jù)類型詳解
本文主要介紹了MySQL中blob和text數(shù)據(jù)類型詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
mysql數(shù)據(jù)庫(kù)在表中添加數(shù)據(jù)三種操作方式
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)在表中添加數(shù)據(jù)三種方式,首先創(chuàng)建數(shù)據(jù)庫(kù)和表,創(chuàng)建完成后就可以進(jìn)行添加數(shù)據(jù)的操作了,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
MySQL數(shù)據(jù)庫(kù)統(tǒng)計(jì)函數(shù)COUNT的使用及說(shuō)明
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)統(tǒng)計(jì)函數(shù)COUNT的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

