MySQL中COUNT如何使用

73次阅读
没有评论

共计 1225 个字符,预计需要花费 4 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章将为大家详细讲解有关 MySQL 中 COUNT 如何使用,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

COUNT(expr)返回检索行中 expr 不为 NULL 的数量,其结果是一个 BIGINT 类型的值,如果没有符合行,那么返回 0。该处需要注意的是所谓的 NULL 指的是 expr 表达式,并不是所需要检测的数据行的值,如果 expr 与数据列名相同,那么则返回该数据列不为 NULL 的数量。

MySQL 的 COUNT

对于传统的存储引擎 InnoDb 而言,存储一个表的精确行数是十分困难的,因为多事务操作可能会并发,并且同时影响表的行数,所以为了避免并发线程查询同一个表而得到不同的行数,InnoDb 没有对表的行数进行内部存储,所以在 InnoDb 中,SELECT(*)仅仅返回当前事务所读取到的行数。在 MySQL5.7.18 之前,InnoDb 通过扫描聚簇索引来处理 SELECTCOUNT(*)语句,5.7.18 之后 InnoDb 使用最小且可用的第二索引来处理 SELECTCOUNT(*)语句(除非查询优化器提示使用一个其他的索引)。如果没有第二索引,那么需要扫描聚簇索引。

如果索引记录没有全部在缓冲池中,那么处理 SELECTCOUNT(*)语句是需要耗费一些时间的。如果需要追求一个快速的计算,那么可以在应用中单独设计一个表用于在目标表进行插入或删除操作时记录其数据条数。然而,在大量的并行处理来 update 目标表的计数器表时会很难扩展。如果可以 SHOWTABLESTATUS 语句来获取该信息。

InnoDb 以相同的方式处理 SELECTCOUNT(*)和 SELECTCOUNT(1),并没有性能上的差距。

对于 MyIsam 引擎,COUNT(*)在没有 WHERE 子句的情况下是非常快的,因为在 MyIsam 引擎中,表的精确行数会被保存下来。如果 MyIsam 表的第一列被设置为非空,那么 COUNT(1)具有同样的优化效果 (在对于 100w 条含有非空的简单数据进行 COUNT(*) 与 COUNT(1)的对比测试没有明显发现性能差异)。

COUNT 的规范

COUNT(*)与 COUNT(常量)都是查找表中记录的行数,可以包含 NULL 数据;COUNT(列名)是查找表中该列非空的函数。

对于 COUNT(*)相比 COUNT(常量)而言,COUNT(*)是 SQL92 中定义的标准统计行数的语法,所以许多数据库对其进行优化,对于 MySQL 而言,COUNT(常量)也是转换为 COUNT(*)执行的,标准语法优先使用 COUNT(*),因为各个数据库查询优化器的优化策略肯定是从 COUNT(*)开始的,阿里的 SQL 开发规范中也明确写明要使用 COUNT(*)。

关于 MySQL 中 COUNT 如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计1225字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)