mysql之count性能比较
1)count(1)、count(*)、count(列)使用场景
- 如果要求统计的是表的结果集,使用count(1)或count(*)
- 如果统计的是列值,使用count(列),count(列)不统计值为NULL的数据
官方文档如下:
- 当查询count(主键)时,语义与count(*)、count(1)一样,但是性能存在差异,count(主键)性能最差,其他两个的性能差异跟数据库引擎有关。
可使用以下脚本查看性能对比:
set profiling = 1;
SELECT SQL_NO_CACHE count(*) from t_pay_process_record;
SELECT SQL_NO_CACHE count(1) from t_pay_process_record;
SELECT SQL_NO_CACHE count(process_record_id) from t_pay_process_record;
show profiles;
结果如下:
2)count(1)、count(*)性能比较
count(1)与count(* )哪一个性能更好,有人说两者差不多,也有说count(1)比count(*)快,众说纷纭。
想要知道答案,最简单粗暴的方式是去看官方文档:
意思就是,Mysql引擎为InnoDB的时候,两者性能是一样的;
如果是MyISAM ,进行select count() 的时候,会对COUNT()进行优化,以快速返回,不会检索其他列,也不会检索WHERE子句,因为MyISAM 对存储了确切的行数,并且可以非常快速地访问,因此这种情况下count(* )会比count(1)会快一些,当然,如果数据表第一个列定义为NOT NULL,count(1)与count(*)性能差不多
官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count
如有不同意见,欢迎指正