count(*), count(1), count(someColumn) 倒底有没有分别? 使用count(someColumn)只取一列,会不会性能好点? 如果是这样的话,那count(1)是不是性能最佳?
答案:
1. count(*)和count(1)完全是一码事:都是用来数“行数”的。MySQL遇到"*", 并不会去展开它。在性能方面,这类查询会走covering index.
2. count(someColumn)跟其他完全不同,它数的是someColumn列中非NULL值的个数。在性能方面,系统会根据someColumn有没有索引,来决定走不走covering index.
例:
drop table if exists play_count; create table play_count( id bigint auto_increment not null, indexed_column varchar(50), --有索引列 non_indexed_column varchar(50), --无索引列 primary key(id), key idx(indexed_column) ); --插入三行数据,存在空值 insert into play_count(indexed_column,non_indexed_column) value('a',null); insert into play_count(indexed_column,non_indexed_column) value(null,'b'); insert into play_count(indexed_column,non_indexed_column) value('c','c'); --count查询 select count(*) from play_count; --返回3 select count(1) from play_count; --返回3 select count(id) from play_count; --返回3 select count(indexed_column) from play_count; --返回2 select count(non_indexed_column) from play_count; --返回2 explain select count(*) from play_count; --Extra: Using Index explain select count(1) from play_count; --Extra: Using Index explain select count(id) from play_count; --Extra: Using Index explain select count(indexed_column) from play_count; --Extra: Using Index explain select count(non_indexed_column) from play_count; --Type: All