返回顶部
首页 > 资讯 > 数据库 >重新认识MySQL中的COUNT语句
  • 728
分享到

重新认识MySQL中的COUNT语句

重新认识MySQL中的COUNT语句 2020-03-25 04:03:12 728人浏览 无得
摘要

在数据库的增删改查操作中,使用最频繁的就是查询操作。 而在所有查询操作中,统计数量操作更是经常被用到。 关于数据库中行数统计,无论是Mysql还是oracle亦或者是sqlServer,都有一个函数可以使用,那就是COUNT。 而对于COU

数据库的增删改查操作中,使用最频繁的就是查询操作。

而在所有查询操作中,统计数量操作更是经常被用到。

关于数据库中行数统计,无论是Mysql还是oracle亦或者是sqlServer,都有一个函数可以使用,那就是COUNT。

而对于COUNT,有几个问题很值得去思考:

1、COUNT有几种用法?

2、COUNT(字段名)和COUNT()的查询结果有什么不同?

3、COUNT(1)和COUNT()之间有什么不同?

4、COUNT(1)和COUNT()之间的效率哪个更高?

5、为什么《阿里巴巴Java开发手册》建议使用COUNT()

6、MySQL的MyISAM引擎对COUNT()做了哪些优化?

7、MySQL的InnoDB引擎对COUNT()做了哪些优化?

8、上面提到的MySQL对COUNT()做的优化,有一个关键的前提是什么?

9、SELECT COUNT() 的时候,加不加where条件有差别吗?

10、COUNT()、COUNT(1)和COUNT(字段名)的执行过程是怎样的?

如果以上10道题,全部准确无误的回答的话,那说明你真的很了解COUNT函数了,如果有哪些知识点是不了解的,那么本文正好可以重新帮你认识一下Count,也为数据库优化做一些思考。

认识COUNT

关于COUNT函数的介绍:

COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。

如果查询结果没有命中任何记录,则返回0

但是,值得注意的是,COUNT() 的统计结果中,会包含值为NULL的行数。

例:

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

使用语句count(),count(id),count(id2)查询结果如下:

select count(),count(id),count(id2)
from #bla
results 7 3 2

除了COUNT(id)和COUNT()以外,还可以使用COUNT(常量)(如COUNT(1))来统计行数,那么这三条SQL语句有什么区别呢?

到底哪种效率更高呢?

为什么《阿里巴巴Java开发手册》中强制要求不让使用 COUNT(列名)或 COUNT(常量)来替代COUNT()呢?

重新认识MySQL中的COUNT语句

COUNT(列名)、COUNT(常量)和COUNT()之间的区别

前面我们提到过COUNT(expr)用于做行数统计,统计的是expr不为NULL的行数,那么COUNT(列名)、 COUNT(常量) 和 COUNT()这三种语法中,expr分别是列名、 常量 和 。

那么列名、 常量 和 这三个条件中,常量是一个固定值,肯定不为NULL。

可以理解为查询整行,所以肯定也不为NULL,那么就只有列名的查询结果有可能是NULL了。

所以, COUNT(常量) 和 COUNT()表示的是直接查询符合条件的数据库表的行数。

而COUNT(列名)表示的是查询符合条件的列的值不为NULL的行数。

除了查询得到结果集有区别之外,COUNT()相比COUNT(常量) 和 COUNT(列名)来讲,COUNT()是SQL92定义的标准统计行数的语法,因为他是标准语法,所以mysql数据库对他进行过很多优化。

SQL92,是数据库的一个ANSI/ISO标准。

它定义了一种语言(SQL)以及数据库的行为(事务、隔离级别等)。

COUNT()的优化

前面提到了COUNT()是SQL92定义的标准统计行数的语法,所以MySQL数据库对他进行过很多优化。

那么,具体都做过哪些事情呢?

这里的介绍要区分不同的执行引擎。

MySQL中比较常用的执行引擎就是InnoDB和MyISAM。MyISAM和InnoDB有很多区别,其中有一个关键的区别和我们接下来要介绍的COUNT()有关,那就是MyISAM不支持事务,MyISAM中的是表级锁;

而InnoDB支持事务,并且支持行级锁。

因为MyISAM的锁是表级锁,所以同一张表上面的操作需要串行进行,所以,MyISAM做了一个简单的优化,那就是它可以把表的总行数单独记录下来,如果从一张表中使用COUNT()进行查询的时候,可以直接返回这个记录下来的数值就可以了,当然,前提是不能有where条件。

MyISAM之所以可以把表中的总行数记录下来供COUNT()查询使用,那是因为MyISAM数据库是表级锁,不会有并发的数据库行数修改,所以查询得到的行数是准确的。

但是,对于InnoDB来说,就不能做这种缓存操作了,因为InnoDB支持事务,其中大部分操作都是行级锁,所以可能表的行数可能会被并发修改,那么缓存记录下来的总行数就不准确了。

但是,InnoDB还是针对COUNT()语句做了些优化的。

在InnoDB中,使用COUNT()查询行数的时候,不可避免的要进行扫表了,那么,就可以在扫表过程中下功夫来优化效率了。

从MySQL 8.0.13开始,针对InnoDB的SELECT COUNT() FROM tblname语句,确实在扫表的过程中做了一些优化。

前提是查询语句中不包含WHERE或GROUP BY等条件。

我们知道,COUNT()的目的只是为了统计总行数,所以,他根本不关心自己查到的具体值,他如果能够在扫表的过程中,选择一个成本较低的索引进行的话,那就可以大大节省时间。

我们知道,InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。

所以,相比之下,非聚簇索引要比聚簇索引小很多,所以MySQL会优先选择最小的非聚簇索引来扫表。

当我们建表的时候,除了主键索引以外,创建一个非主键索引还是有必要的。

至此,我们介绍完了MySQL数据库对于COUNT()的优化,这些优化的前提都是查询语句中不包含WHERE以及GROUP BY条件。

COUNT()和COUNT(1)

介绍完了COUNT(),接下来看看COUNT(1),对于,这二者到底有没有区别,网上的说法众说纷纭。

有的说COUNT()执行时会转换成COUNT(1),所以COUNT(1)少了转换步骤,所以更快。

还有的说,因为MySQL针对COUNT()做了特殊优化,所以COUNT()更快。

那么,到底哪种说法是对的呢?

看下MySQL官方文档是怎么说的:

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

画重点:

same way , no performance difference。

所以,对于COUNT(1)和COUNT(),MySQL的优化是完全一样的,根本不存在谁比谁快!

那既然COUNT()和COUNT(1)一样,建议用哪个呢?

建议使用COUNT()!

因为这个是SQL92定义的标准统计行数的语法,而且本文只是基于MySQL做了分析,关于Oracle中的这个问题,也是众说纷纭的呢。

COUNT(字段)

最后,就是我们一直还没提到的COUNT(字段),他的查询就比较简单粗暴了,就是进行全表扫描,然后判断指定字段的值是不是为NULL,不为NULL则累加。相比COUNT(),COUNT(字段)多了一个步骤就是判断所查询的字段是否为NULL,所以他的性能要比COUNT()慢。

总结

本文介绍了COUNT函数的用法,主要用于统计表行数。

主要用法有COUNT()、COUNT(字段)和COUNT(1)。

因为COUNT()是SQL92定义的标准统计行数的语法,所以MySQL对他进行了很多优化,MyISAM中会直接把表的总行数单独记录下来供COUNT()查询,而InnoDB则会在扫表的时候选择最小的索引来降低成本。当然,这些优化的前提都是没有进行where和group的条件查询。

在InnoDB中COUNT()和COUNT(1)实现上没有区别,而且效率一样,但是COUNT(字段)需要进行字段的非NULL判断,所以效率会低一些。

因为COUNT()是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT()查询表的行数!*

本文来自木庄网络博客> 重新认识MySQL中的COUNT语句

您可能感兴趣的文档:

--结束END--

本文标题: 重新认识MySQL中的COUNT语句

本文链接: https://lsjlt.com/news/1897.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 重新认识MySQL中的COUNT语句
    在数据库的增删改查操作中,使用最频繁的就是查询操作。 而在所有查询操作中,统计数量操作更是经常被用到。 关于数据库中行数统计,无论是MySQL还是Oracle亦或者是SqlServer,都有一个函数可以使用,那就是COUNT。 而对于COU...
    99+
    2020-03-25
    重新认识MySQL中的COUNT语句
  • 重新认识Java中的ThreadLocal
    目录究竟是啥结构内存泄漏是什么鬼说来也惭愧,这个 ThreadLocal 其实一直都是一知半解,而且看了一下之后还发现记错了,所以还是记录下 原先记忆里的都是反过来,一个 Threa...
    99+
    2024-04-02
  • mysql中count()语句的用法介绍
    本篇内容主要讲解“mysql中count()语句的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql中count()语句的用法介绍”吧!查看表结构...
    99+
    2024-04-02
  • 带你重新认识MyBatis的foreach
    目录难记空集合问题解法优雅的解法一种简化<foreach>的设想总结用了MyBatis的同行,应该见过foreach,它一般是这样用的: <select ...
    99+
    2022-11-13
    MyBatis的foreach MyBatis foreach
  • MySQL中的count()、union()和group by语句的用法
    本篇内容介绍了“MySQL中的count()、union()和group by语句的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
    99+
    2024-04-02
  • mysql中更新语句怎么写
    mysql 更新语句可修改现有表数据。语法为:update table_name set column1 = value1, column2 = value2, ... whe...
    99+
    2024-04-26
    mysql
  • 初识Mysql的主要10条语句
    下文给大家带来Mysql的主要10条语句有关内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完Mysql的主要10条语句你一定会有所收获。1.查看当前云服务器下面,...
    99+
    2024-04-02
  • MySQL数据库的更新语句
    本篇内容主要讲解“MySQL数据库的更新语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据库的更新语句”吧!  一、INSERT和REPLACE ...
    99+
    2024-04-02
  • MySQL 数据查重、去重的实现语句
    有一个表user,字段分别有id、nick_name、password、email、phone。 一、单字段(nick_name) 查出所有有重复记录的所有记录 select * from user w...
    99+
    2022-05-24
    MySQL 数据查重 MySQL 数据去重
  • 如何在 MySQL INSERT 语句中指定默认值?
    在创建表时,如果任何列定义了默认值,那么通过在 INSERT 语句中使用关键字“DEFAULT”,我们可以为该列获取默认值。例如,我们创建了一个表“employee”,其默认值为“DOJ”列,如下所示 -mysql> Create t...
    99+
    2023-10-22
  • 如何实现MySQL中重命名表的语句?
    MySQL是一种常用的关系型数据库管理系统,它支持重命名表的操作。通常情况下,重命名表会带来一定的风险,因此在执行这个操作时应该非常小心谨慎。在本文中,我们将探讨如何在MySQL中实现重命名表的语句,并提供详细的代码示例。在MySQL中,可...
    99+
    2023-11-08
    MySQL 重命名 编程关键词:
  • mysql数据库中Update更新语句的用法
    Update更新语句,一般与WHERE搭配使用,指定要更改的那一条数据的条件,使用UPDATE的SET来修改指定的字段为指定的值。语法如下:例如:要修改Person数据表中LastName等于Wil...
    99+
    2024-04-02
  • 如何实现MySQL中更新数据的语句?
    如何实现MySQL中更新数据的语句?MySQL作为广泛使用的关系型数据库管理系统,提供了强大的功能来处理数据的更新。本文将详细介绍如何使用MySQL的更新语句来修改数据库中的数据,并提供具体的代码示例。首先,我们需要了解MySQL中更新数据...
    99+
    2023-11-09
    更新 MySQL 语句
  • Mysql中的LIMIT 语句
    1. LIMIT 语句简介 LIMIT 语句是 MySQL 中常用的语句之一,它主要用于从关系型数据库中读取数据时,指定需要读取的行数。可以利用该语句实现分页功能,或者限制结果集返回的行数。其中最常用的语法格式如下: SELECT...
    99+
    2023-09-09
    数据库 sql mysql
  • mysql更新语句的具体写法
    下文主要给大家带来mysql更新语句的具体写法,希望这些内容能够带给大家实际用处,这也是我编辑mysql更新语句的具体写法这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。    ...
    99+
    2024-04-02
  • 认识Go语言中的引用传递
    在 go 中,传递引用类型变量时发生引用传递,其中 * 符号表示引用类型。传递引用类型变量时,实际上传递的是指向原始值的地址,修改引用类型变量会影响原始值。 认识 Go 语言中的引用传...
    99+
    2024-04-03
    go 引用传递 go语言
  • MySQL 中的 UNION 语句
    文章目录 一、数据准备一、UNION 和 UNION ALL二、UNION 的执行顺序(UNION 和其他语句一同出现)三、MySQL 使用 UNION(ALL) + ORDER 导致排序失效...
    99+
    2023-08-23
    mysql 数据库 sql
  • 【Python基础知识】Python中的while语句
    很多初学Python的小伙伴不知道该从何开始学起,其实零基础学习的话可以先学习一些Python基础知识,等基础打牢之后再去接触更加深入的技术,接下来小编就为大家简单介绍一下有关于Python中while语句的内容,希望对大家的学习有帮助。1...
    99+
    2023-06-02
  • MySQL 重写查询语句的三种策略
    在优化存在问题的查询时,我们需要改变方式去获取查询结果——但这并不意味着从 MySQL获取同样的结果集。有些时候我们可以将查询转换为获取相同结果,但更好性能的查询形式。然而,我们也需要考虑重写查询去获取不同的结果,因...
    99+
    2022-05-23
    MySQL 查询语句 MySQL 重写查询语句
  • 记一次MySQL更新语句update的踩坑
    背景 最近在一次线上作业过程中执行了一句DML语句,本以为万无一失,结果应用反馈说没有更新,数据还是没有变,最后经过排查才发现是我语句写错了,导致update语句执行的结果与预期不符。 情景再现 为了方便演示,建立一...
    99+
    2022-05-28
    MySQL 更新语句 MySQL update
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作