[MySQL] count(*) vs count(1) vs count(column)

MySQL版本:5.7.9

数据表结构为:
category: InnoDB 引擎,无索引

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(220) NOT NULL,
  `created_time` datetime NOT NULL,
  `updated_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10277277 DEFAULT CHARSET=utf8

category2: InnoDB 引擎,name 字段有索引

CREATE TABLE `category2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(220) NOT NULL,
  `created_time` datetime NOT NULL,
  `updated_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `Index` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10277277 DEFAULT CHARSET=utf8

category3: MyISAM 引擎,无索引

CREATE TABLE `category3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(220) NOT NULL,
  `created_time` datetime NOT NULL,
  `updated_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10277277 DEFAULT CHARSET=utf8

category4: MyISAM 引擎,name字段有索引

CREATE TABLE `category4` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(220) NOT NULL,
  `created_time` datetime NOT NULL,
  `updated_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `Index` (`name`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=10277277 DEFAULT CHARSET=utf8

注:表的数据完全一致,数据量:10277276 行。

一、count(*) vs count(1)

1、对以下语句进行测试(不带where条件)
select count(*) from category;
select count(1) from category;

各执行5次结果为:

执行次数category count(*)category count(1)category2 count(*)category2 count(1)category3 count(*)category3 count(1)category4 count(*)category4 count(1)
11.26 s1.22 s1.22 s1.23 s0.00 s0.00 s0.00 s0.00 s
21.24 s1.20 s1.24 s1.24 s0.00 s0.00 s0.00 s0.00 s
31.22 s1.22 s1.22 s1.23 s0.00 s0.00 s0.00 s0.00 s
41.22 s1.20 s1.23 s1.23 s0.00 s0.00 s0.00 s0.00 s
51.23 s1.24 s1.24 s1.22 s0.00 s0.00 s0.00 s0.00 s



从以上结果可以看出:
1、不带where条件下,count(*) 和 count(1) 查询性能大致相同;
2、 MyISAM 引擎性能最好,这是由于 MySQL 对 MyISAM 引擎的优化:该引擎存储了当前数据总行数,当执行无where条件的count查询时,直接返回该变量(可参看MySQL官方文档)。

2、对以下语句进行测试(带where条件)
select count(*) from category where name = 'cate_1000';
select count(1) from category where name = 'cate_1000';

各执行5次结果为:

执行次数category count(*)category count(1)category2 count(*)category2 count(1)category3 count(*)category3 count(1)category4 count(*)category4 count(1)
12.27 s2.29 s0.00 s0.00 s1.72 s1.61 s0.00 s0.00 s
22.28 s2.30 s0.00 s0.00 s1.49 s1.67 s0.00 s0.00 s
32.34 s2.30 s0.00 s0.00 s1.48 s1.59 s0.00 s0.00 s
42.35 s2.25 s0.00 s0.00 s1.47 s1.66 s0.00 s0.00 s
52.33 s2.23 s0.00 s0.00 s1.52 s1.69 s0.00 s0.00 s



从以上结果可以看出:
1、带where条件时,count(*) 和 count(1) 性能大致相同;
2、带索引条件下,性能远远超过不带索引情况;
3、不带索引时,MyISAM 执行 count 性能比 InnoDB 性能好;


综上:count(*) 和 count(1) 性能大致相同。

二、count(id)(主键) vs count(name)(普通列)

1、对以下语句进行测试(不带where条件)
select count(id) from category;
select count(name) from category;

各执行5次结果为:

执行次数category count(id)category count(name)category2 count(id)category2 count(name)category3 count(id)category3 count(name)category4 count(id)category4 count(name)
11.41 s1.47 s1.41 s1.50 s0.00 s0.00 s0.00 s0.00 s
21.42 s1.48 s1.41 s1.47 s0.00 s0.00 s0.00 s0.00 s
31.41 s1.48 s1.40 s1.48 s0.00 s0.00 s0.00 s0.00 s
41.40 s1.48 s1.44 s1.48 s0.00 s0.00 s0.00 s0.00 s
51.40 s1.45 s1.42 s1.47 s0.00 s0.00 s0.00 s0.00 s



以上结果可以看出:
1、count(id) 和 count(name) 性能大致相同;
2、不带where条件时,执行count(column)性能和有无索引无关;

2、对以下语句进行测试(带where条件)
select count(id) from category where name = 'cate_1000'; 
select count(name) from category where name = 'cate_1000'; 

各执行5次结果为:

执行次数category count(id)category count(name)category2 count(id)category2 count(name)category3 count(id)category3 count(name)category4 count(id)category4 count(name)
12.50 s2.29 s0.00 s0.00 s1.50 s1.47 s0.00 s0.00 s
22.66 s2.25 s0.00 s0.00 s1.48 s1.46 s0.00 s0.00 s
32.67 s2.28 s0.00 s0.00 s1.53 s1.46 s0.00 s0.00 s
42.50 s2.25 s0.00 s0.00 s1.49 s1.49 s0.00 s0.00 s
52.65 s2.28 s0.00 s0.00 s1.63 s1.48 s0.00 s0.00 s



以上结果可以看出:
1、InnoDB 引擎下,带where参数且无索引时,count(id) (主键)性能比 count(column)(普通列)性能差;
2、不带索引情况下,MyISAM 执行 count(column) 性能比 InnoDB性能好;


综上,
1、大多数情况下,环境相同时,count(id) 和 count(name) 性能大致相同;
2、InnoDB引擎下,带where条件且无索引时,count(id)性能比count(name)差;

三、总结

1、无where条件时:
MyISAM( count(*) = count(1) = count(id) = count(name) ) > InnoDB( count(*) = count(1) > count(id) = count(name) )

2、带where条件时:
(1)、查询字段有索引时,MyISAM、InnoDB引擎下:
count(*) = count(1) = count(id) = count(name)

(2)、查询字段无索引时:
MyISAM( count(*) = count(1) = count(id) = count(name) ) > InnoDB( count(*) = count(1) = count(name) > count(id) )
注:有索引性能 大于 无索引。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值