MySQL:COUNT语句的索引使用

本文探讨了数据库索引对查询性能的影响。通过创建不同字段的索引,观察MySQL在count(*)操作时如何选择最优索引。实验结果显示,没有非主键索引时使用主键,存在非主键索引则会选择最小的。count(字段)操作会利用相应字段的索引,提升查询效率。优化索引有助于减少扫描次数,提高数据库性能。
摘要由CSDN通过智能技术生成

我们先准备好测试数据

create table user_test_count
(
    id       int primary key not null auto_increment,
    name     varchar(45),
    age      int,
    email    varchar(60),
    birthday date
) engine 'innodb';

insert into user_test_count (id, name, age, email, birthday)
values (1, '张三', 20, 'zhangsan@aaa.com', '2000-01-01');
insert into user_test_count (id, name, age, email, birthday)
values (2, '李四', 30, 'lisi@bbb.com', '1990-01-01');
insert into user_test_count (id, name, age, email, birthday)
values (3, '王五', 40, null, null);
insert into user_test_count (id, name, age, email, birthday)
values (4, '赵六', 50, null, null);

我们先直接使用count(*)

explain select count(*) from user_test_count;

可以看到key使用了主键
在这里插入图片描述

然后我们给email字段添加一个索引
在这里插入图片描述
我们再次执行上述explain语句,可以看到这次使用了email的索引,key_len长度为243
在这里插入图片描述
然后我们再添加一个birthday字段的索引
在这里插入图片描述

执行上述explain语句,这次使用了birthday的索引,key_len长度为4
在这里插入图片描述
由此我们可以得出以下结论:

  1. 当没有非主键索引时,会使用主键索引
  2. 如果存在非主键索引的话,会使用非主键索引
  3. 如果存在多个非主键索引,会使用一个最小的非主键索引

其原因是:在innodb中,非主键索引叶子节点存储的结构是:索引+主键;主键索引叶子节点是:主键+表数据。在1个page里面,非主键索引可以存储更多的条目,例如:
对于一张表,如果有1000000数据,使用非主键索引扫描的page数可能是100 ,而使用主键索引page数可能是500,此时使用非主键索引的性能会更好。同理如果存在多个非主键索引,会使用一个最小的非主键索引,也是为了在一个page里存储更多的数据,从而减少扫描次数,提高性能。

我们可以再试一下单字段的count

explain select count(email) from user_test_count;

可以看到还是撞在email的索引上
在这里插入图片描述
说明:count(字段)只会针对该字段统计,使用这个字段上面的索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值