前言
count函數(shù)是用來統(tǒng)計(jì)表中或數(shù)組中記錄的一個(gè)函數(shù),count(*) 它返回檢索行的數(shù)目, 不論其是否包含 NULL值。最近感覺大家都在討論count的區(qū)別,那么我也寫下吧:歡迎留言討論,話不多說了,來一起看看詳細(xì)的介紹吧。
1、表結(jié)構(gòu):
dba_jingjing@3306>[rds_test]>CREATE TABLE `test_count` ( -> `c1` varchar(10) DEFAULT NULL, -> `c2` varchar(10) DEFAULT NULL, -> KEY `idx_c1` (`c1`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.11 sec)
2、插入測試數(shù)據(jù):
dba_jingjing@3306>[rds_test]>insert into test_count values(1,10); Query OK, 1 row affected (0.03 sec) dba_jingjing@3306>[rds_test]>insert into test_count values(abc,null); ERROR 1054 (42S22): Unknown column 'abc' in 'field list' dba_jingjing@3306>[rds_test]>insert into test_count values('abc',null); Query OK, 1 row affected (0.04 sec) dba_jingjing@3306>[rds_test]>insert into test_count values(null,null); Query OK, 1 row affected (0.04 sec) dba_jingjing@3306>[rds_test]>insert into test_count values('368rhf8fj',null); Query OK, 1 row affected (0.03 sec) dba_jingjing@3306>[rds_test]>select * from test_count; +-----------+------+ | c1 | c2 | +-----------+------+ | 1 | 10 | | abc | NULL | | NULL | NULL | | 368rhf8fj | NULL | +-----------+------+ 4 rows in set (0.00 sec)
測試:
dba_jingjing@3306>[rds_test]>select count(*) from test_count; +----------+ | count(*) | +----------+ | 4 | +----------+ 1 row in set (0.00 sec) EXPLAIN: { "query_block": { "select_id": 1, "message": "Select tables optimized away" 1 row in set, 1 warning (0.00 sec)
dba_jingjing@3306>[rds_test]>select count(1) from test_count; +----------+ | count(1) | +----------+ | 4 | +----------+ 1 row in set (0.00 sec) EXPLAIN: { "query_block": { "select_id": 1, "message": "Select tables optimized away" 1 row in set, 1 warning (0.00 sec)
dba_jingjing@3306>[rds_test]>select count(c1) from test_count; +-----------+ | count(c1) | +-----------+ | 3 | +-----------+ 1 row in set (0.00 sec) "table": { "table_name": "test1", "access_type": "index", "key": "idx_c1", "used_key_parts": [ "c1" ], "key_length": "33",
那么這里面的"key_length": "33",為什么是33呢,什么是二級索引?見下節(jié)
count(*) 和count(1) 是沒有區(qū)別的,而count(col) 是有區(qū)別的
執(zhí)行計(jì)劃有特點(diǎn):可以看出它沒有查詢索引和表,有時(shí)候會出現(xiàn)select tables optimized away 不會查表,速度會很快
Extra有時(shí)候會顯示“Select tables optimized away”,意思是沒有更好的可優(yōu)化的了。
官方解釋For explains on simple count queries (i.e. explain select count(*) from people) the extra
section will read "Select tables optimized away."
This is due to the fact that MySQL can read the result directly from the table internals and therefore does not need to perform the select.
---MySQL對于“Select tables optimized away”的含義, 不是"沒有更好的可優(yōu)化的了", 官方解釋中關(guān)鍵的地方在于:
MySQL can read the result directly
所以,合理的解釋是:
1 數(shù)據(jù)已經(jīng)在內(nèi)存中可以直接讀取;
2 數(shù)據(jù)可以被認(rèn)為是一個(gè)經(jīng)計(jì)算后的結(jié)果,如函數(shù)或表達(dá)式的值;
3 一旦查詢的結(jié)果被優(yōu)化器"預(yù)判"可以不經(jīng)執(zhí)行就可以得到結(jié)果,所以才有"not need to perform the select".
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
標(biāo)簽:平頂山 四川 浙江 安徽 那曲 安康 濮陽 山南
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL中count(*)、count(1)和count(col)的區(qū)別匯總》,本文關(guān)鍵詞 MySQL,中,count,和,col,的,區(qū)別,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。