面试经常会问一个问题,就是以下三种方式哪个更快:
select count(*) from table_name;
select count(1) from table_name;
select count(column_name) from table_name;
首先要了解它们之间的区别,count(*)
和count(1)
计算所有数据中包括NULL值的行数,而count(column_name)
计算指定列的行数,但是不包括NULL值
既然count(*)
和count(1)
功能一样,那哪个更快呢,其实这跟存储引擎有关。
InnoDB存储引擎中,两者一样快,因为InnoDB对两者做同样的处理,如下面MySQL官网截图
InnoDB的计算方式为,InnoDB通过遍历最小的可用二级索引来处理SELECT COUNT(*)
语句,除非索引或优化器提示指示优化器使用不同的索引。如果二级索引不存在,则通过扫描聚集索引来处理语句
而在MyISAM中,MyISAM表存储了数据的准确行数,因此count(*)
会直接读取该行数,而只有第一列定义为NOT NULL时,count(1)
才会进行相同的优化,所以在MyISAM中count(*)
>= count(1)
在两个引擎中,count(column_name)
会遍历整个表,但不同的是,它会先获取列,然后判断是否为空,然后加起来,因此count(column_name)
性能肯定不如前两者。
因此最终的结论为:
- InnoDB中:
count(*)
=count(1)
>count(column_name)
- MyISAM中:
count(*)
>=count(1)
>count(column_name)
如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔的个人网站