count(*)和count(1)

本文深入探讨了MySQL中COUNT(*)与COUNT(1)在不同存储引擎(InnoDB与MyISAM)下的性能表现。在InnoDB中,两者无性能差异。而在MyISAM中,COUNT(*)在特定条件下更快,但COUNT(1)在有WHERE子句且首列非空时仍保持优化。文章基于Mysql5.7版本,强调了参考官方文档的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、直入正题

两者一样快!

Mysql官方文档有明确说明,原文链接如下:

https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count

所有讨论,针对Mysql5.7版本。

二、InnoDB和MyISAM有些不同 

1、InnoDB

官方文档这么写的:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

意思是:

InnoDB 存储引擎对select count(*)和select count(1)两者的操作控制方式是一样的。它们没有性能上的差别。

2、MyISAM

官方文档这么写的:

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example:

mysql> SELECT COUNT(*) FROM student;

This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

意思是:

MyISAM 存储引擎在执行查询的时候,查询优化器优化了COUNT(*)和COUNT(1)操作。因为MyISAM存储引擎是记录行号的,查询的时候直接返回了行号,所以执行的非常快。

不过直接返回行号的优化,对两者的要求不同:

①COUNT(*)要满足没有where条件;

②COUNT(1)没有where条件可以,在有where条件时,满足首列有非空属性依然可以。

三、where条件

在加了where条件的时候两者的快慢,其实在同一储引擎中,两者仍然是一样的。

之前我看过不少博主讨论,where条件中如果被检索的列如果加了索引,速度会提升。

那是必然啊,加了索引本身就是提升检索效率的,这里不做赘述。

四、其他

作为一个研发,要养成参考官方文档的习惯。

 

 

 

 

                                                                                                                     Copyright © 2018 Ansel. All rights reserved.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ansel_TbN1

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值