MySQL count(*),count(1),count(主键),count(字段)哪一个更快

假设有下面一个表:
Create Table: CREATE TABLE test (
id int(11) NOT NULL AUTO_INCREMENT,
col1 int(11) DEFAULT NULL,
PRIMARY KEY (id),
KEY idx_col1 (col1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

下面几个统计表总数的SQL哪一个更快?
select count(col1) from test;
select count(id) from test;
select count(1) from test;
select count(*) from test;

我们逐个分析一下执行过程。
1.select count(col1) from test;
当col1 字段not null时,遍历索引idx_col1,每读取一条记录将count总数加1;
当col1 字段允许为null,遍历索引idx_col1,每读取一条记录,先判断是否为null,不为null时将count总数加1。

2.select count(id) from test;
由于id是主键,具有唯一属性,所以只需要遍历主键索引,过程中不需要判断是否null,每读取一条记录将count总数加1。

3.select count(1) from test;
遍历整张表,但不取具体的行数据到内存,只是对于每返回的一行,server层都放一个数字’1’进去,每一行数据将count总数加1。

4.select count(*) from test;
遍历整张表,但对于count(*),MySQL做了优化,不会读取具体的行数据,只要读取到一行,就按行累加。

最后,我们来回顾一下。
count(字段)的方式,如果字段上有索引,如果允许为null,对于每一个字段的值还要进行一次判断;如果字段上没有索引,那么也是要走主键索引。所以一般情况下,count(主键)快于count(字段)。
但是如果主键索引的数据行非常大,而字段索引的键值比较短,也就是说,遍历主键索引所读取的数据块要多于遍历二级索引的数据块,那么有可能count(字段)要快于count(主键)。

综合起来,几个count的效率排序如下:
count(*)>count(1)>count(主键)>count(字段)

展开阅读全文
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值