MySQL的count()函数

这篇具有很好参考价值的文章主要介绍了MySQL的count()函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在面试的时候或者平时工作的时候,经常会遇到MySQL中的count()函数,本文就是主要学习并了解count()函数中的性能以及效率问题。

count()聚合函数简介

count() 是一个聚合函数,函数的参数不仅可以是字段名,也可以是其他任意表达式,该函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个

比如select count(name) from t_order;这条语句是统计「 t_order 表中,name 字段不为 NULL 的记录」有多少个。也就是说,如果某一条记录中的 name 字段的值为 NULL,则就不会被统计进去。

不同存储引擎实现

在不同的存储引擎中,实现count()函数的方法是不一样的。

MyISAM

MyISAM引擎每张表的总行数是存储在磁盘上,所以当执行 count(*) 时,是直接从磁盘拿到这个值返回,能够快速返回。但是如果加WHERE条件,则该优化就不起作用。

Innodb

虽然Innodb表里也存了一个表行数的概念,但是这个官方给的是预估值,并不能把这个数值用来代替count()的结果。

这里要简单说下MVCC即版本并发控制。因为Innodb是支持事务的。

MVCC

MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

就是因为要实现多版本并发控制,所以才导致 InnoDB 引擎不能直接存储表总记录数。因为每个事务获取到的一致性视图都是不一样的,所以返回的数据总记录也是不一致的。

具体实现
  • 只有聚簇索引的情况

    在这种情况下,count(*)count(1)都会根据循环遍历聚簇索引(主键索引),将读取到的记录返回给 server 层,但是不会读取记录中的任何字段的值,因为他们的参数都不可能是空;

    count(主键)也是循环遍历聚簇索引(主键索引),将读取到的记录返回给 server 层,但是会读取主键值并判断是否为空,不为空则count+1,因为多了一步操作,所以效率上略低于上面两种。

    而如果是count(普通列)的话就是全表扫描了,性能最差。

  • 存在聚簇索引和二级索引

    在聚簇索引和二级索引都存在的情况下,因为相同数量的二级索引记录可以比聚簇索引记录占用更少的存储空间,所以二级索引树比聚簇索引树小,这样遍历二级索引的 I/O 成本比遍历聚簇索引的 I/O 成本小,因此「优化器」优先选择的是二级索引。索引count(*)count(1)count(主键)会使用key_len 最小的二级索引进行扫描。只有当没有二级索引的时候,才会采用主键索引来进行统计。但是count(主键)也是会有一次判空操作,所以效率会稍微低点。

    count(普通列)如果这个列是存在二级索引的,那么就遍历这个二级索引,读取主键值进行判空,不为空则count+1,如果不存在二级索引,那么就是全表扫描,性能很差,所以不建议使用这种方法。

    MySQL 5.7 的官方手册中有这么一句话:

    InnoDB以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作,没有性能差异。

总结

执行结果

从执行的结果数量来看:

count(1) = count(*) = count(主键) >= count(普通列)

因为count()会过滤到NULL值,而前三个都是不可能为空,所以查询出来的数量一致。如果普通的列字段也是不可为空的,那么数量就和前三者一致,否则的话就会小于前三者。

执行效率

count(1) = count(*) > count(主键) > count(普通列)

因为主键和普通列都有获取数据判断NULL操作,且普通列如果没有索引的情况下还会造成全表扫描。

因为主键和普通列都有获取数据判断NULL操作,且普通列如果没有索引的情况下还会造成全表扫描。

使用推荐

在使用count()函数的时候,推荐直接使用count(*)函数即可,既避免了一些复杂的判断,又能使用到底层执行器的默认优化,最大程度减少麻烦。文章来源地址https://www.toymoban.com/news/detail-428398.html

到了这里,关于MySQL的count()函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL server 与 MySQL count函数、以及sum、avg 是否包含 为null的值

    sql server 与 mysql count 作用一样。 count 计算指定字段出现的个数, 不是计算 null的值 获取表的条数 count(n) n:常数 count(1),count(0)等 count(*) count(字段) 其中字段为null 不会统计在内。 avg(字段)、sum(字段) 跟count(字段) 一样 不统计字段为null的。

    2024年02月14日
    浏览(51)
  • java面试题(16):Mysql一致性视图是啥时候建立的

    1 演示错误案例 先给大家来一个错误演示。 我们打开两个会话窗口,默认情况下隔离级别是可重复读,我们来看下: 首先在 A 会话中查看当前 user 表,查看完成后开启事务: 可以看到id=3的数据sex是男。 接下来在 B 会话中修改 sex: 查看修改成功 接下来回到A会话查询: 可以

    2024年02月12日
    浏览(43)
  • python:count函数

    count函数用于统计字符串/列表/元组的某个字符或元素出现的次数 str:可以是单字符,也可以是多字符 start:索引字符串的起始位置 end:索引字符串的结束位置,默认为字符串的长度len(s) 例:统计字符串某字符出现的次数: 统计列表中某元素出现的次数: 元组也同理,列出

    2024年02月12日
    浏览(53)
  • SQL COUNT() 函数

    COUNT() 函数返回匹配指定条件的行数。 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入): SELECT COUNT(column_name) FROM table_name; SQL COUNT(*) 语法 COUNT(*) 函数返回表中的记录数: SELECT COUNT(*) FROM table_name; SQL COUNT(DISTINCT column_name) 语法 COUNT(DISTINCT column_

    2024年02月08日
    浏览(38)
  • Python count()函数详解

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 count() 是Python的内置函数,可以 「统计」 字符串里指定 「字符」 或指定字

    2024年02月11日
    浏览(35)
  • mysql中的count(1)、count(*)、count(id)哪个更快?

    1 首先我们要先了解count()方法的原理 count()方法的作用就是计算当前sql语句所能查到的 非NUL L的行数, mysql分为server层和存储引擎层,具体结构如下: 常见的存储引擎是InnoDB、myisam。 为什么要介绍引擎种类呢?因为count()方法在不同的存储引擎下,他的实现方式是不一样的。

    2024年02月07日
    浏览(39)
  • 【SQL】COUNT()函数 用法详解

    COUNT函数用法: COUNT ( [ALL | DISTINCT] column | expression | *) ALL指示统计所有值,而DISTINCT强制函数仅对不同的值进行操作。 默认情况下,使用ALL选项。 条件表达式 COUNT()函数中条件表达式加 OR null。例如, SELECT COUNT(number 200 OR null) FROM vf; COUNT()函数中条件表达式使用

    2024年04月25日
    浏览(34)
  • Excel COUNT类函数使用

    ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 ✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7,B2到B7的所有数字单元格的数量 ⏹计算给定范围内所有非空单元格的数量,包括包含文本、数值、错误值和空白字符的单元格。 基本语法 ✅统计A2到A7所有非空单元格的

    2024年02月04日
    浏览(33)
  • MySQL中count(*)和count(1)和count(column)使用比较

    分页查询数据,需要返回total,而这个值一般都是通过count函数实现。但是,针对count函数,有多种写法,如count(*)、count(1) 和 count(column)等。本文主要介绍以上几种写法的差异。 注意,这里仅针对MySQL数据库,其他类型的数据库仅供参考。 count() 函数是标准SQL提供的一个聚合函

    2024年02月10日
    浏览(41)
  • MySql前言

    🎥 个人主页:Dikz12 🔥个人专栏:MySql 📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香 欢迎大家👍点赞✍评论⭐收藏 目录  数据库有哪些软件??  Mysql  MySql数据存储 mysql安装 mysql重装                                                          Oracle: 数据

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包