mysql统计count(*),count(1),count(id),究竟哪种效率更高?

文章探讨了count(*)在不同数据库引擎中的执行机制,指出MyISAM对count(*)的高效支持,而InnoDB需逐行计数。对于大型数据库,推荐使用count(*)但可能较慢,讨论了优化策略和用户反馈。

一、前言

在开发系统的时候,你可能经常需要计算一个表的行数,这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?
但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。

二、count(*)的实现方式

1.MyISAM 引擎

把一个表的总行数存在了磁盘上,因此执行count(*) 的时候会直接返回这个数,效率很高。

2.InnoDB 引擎

它执行count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

这里,首先你要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。
所以,count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

三、count介绍

1. count(id)

InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。

2. count(1)

InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。

3. count(字段)

  • 如果这个“字段”是定义为 not null 的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值