mysql中的count(1)、count(*)、count(id)哪个更快?

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

今天和大家聊一下mysql中的count()方法

我们日常开发中,经常会用到count()命令,有的人用count(*),有的人用count(1),还有的人用count(id),那么这几种写法都有什么区别呢?哪种方法效率更高呢?今天我们就来解密一下

1 首先我们要先了解count()方法的原理

count()方法的作用就是计算当前sql语句所能查到的非NULL的行数,
mysql分为server层和存储引擎层,具体结构如下:
mysql中的count(1)、count(*)、count(id)哪个更快?

常见的存储引擎是InnoDB、myisam。
为什么要介绍引擎种类呢?因为count()方法在不同的存储引擎下,他的实现方式是不一样的。

例如语句 select count(*) from table1;

在myisam引擎的数据表里,会有个单独的字段,用来记录当前表里有几行数据,因此当查询行数的时候,直接返回这个字段就可以了,速度自然是相当迅速。

在InnoDB引擎里,实现方式则是选择体积最小的索引树,然后通过遍历叶子节点的个数,以此来获取全表的数据。

所以在InnoDB中,当count()需要扫描的数据量越大的时候,所消耗的时间就会越长。

2 也许有人会问为什么InnoDB不能像MyIsam那样单独记录表行数呢?

MyIsam和InnoDB最大的区别就是MyIsam不支持事务,InnoDB支持事务。
而事务有四种隔离级别,其中默认的就是可重复读。

InnoDB通过MVCC实现了可重复读隔离级别,事务开启之后多次执行同样的select,执行的结果都会是同样的数据。
我们看个例子:
mysql中的count(1)、count(*)、count(id)哪个更快?
如上图所示,有两个事务A、B,一开始table1表里就2条数据,事务A也确实查到了2条,在A第一次查完之后,事务B插入了一条数据,此时table1表里会有3条数据,事务A再次查询还是只能查到2条数据。这就是MVCC保证了在同一事务中,查询的结果是一样的。

也正因为有事务隔离级别,所以不同的事务在同一时间下,查询的表内数据会是不一致的,以此InnoDB是没办法像MyIsam那样,在表里单纯的加个字段来存储表数据行数的。

3 回到正题,count()括号里可以放置各种字段,甚至是非字段,那么他们都有什么区别呢?

count方法的大原则是server层会从innodb存储引擎里读来一行行数据,并且只累计非null的值。但这个过程,根据count()方法括号内的传参,有略有不同。

(1) count(*)

server层拿到innodb返回的行数据,不对里面的行数据做任何解析和判断,默认取出的值肯定都不是null,直接行数+1。

(2) count(1)

server层拿到innodb返回的行数据,每行放个1进去,默认不可能为null,直接行数+1。

(3) count(某个列字段)

由于指明了要count某个字段,innodb在取数据的时候,会把这个字段解析出来返回给server层,所以会比count(1)和count(*)多了个解析字段出来的流程。

  • 如果这个列字段是主键id,主键是不可能为null的,所以server层也不用判断是否为null,innodb每返回一行,行数结果就+1.
  • 如果这个列是普通索引字段,innodb一般会走普通索引,每返回一行数据,server层就会判断这个字段是否为null,不是null的情况下+1。当然如果建表sql里字段定义为not null的话,那就不用做这一步判断直接+1。
  • 如果这个列没有加过索引,那innodb可能会全表扫描,返回的每一行数据,server层都会判断这个字段是否为null,不是null的情况下+1。同上面的情况一样,字段加了not null也就省下这一步判断了。

现在应该对他们的执行效率有数了吧
大概如下:
count(*) = count(1) > count(主键id) > count(普通索引列) > count(未加索引列)

所以说count(*)是最快的文章来源地址https://www.toymoban.com/news/detail-465099.html

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

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

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

相关文章

  • 【MySQL】好好学习一下InnoDB中的页

    周末没啥计划,把大佬的MySQL是怎样运行的又翻了出来,重新学习一下页的概念。 页这个东西,看起来不怎么显眼,但是深层的东西都会碰到他,又爱又恨,逼着人必须弄懂。 高并发里面有一种提高性能的思路是 :通过批处理一次性处理大量数据,避免频繁的网络流量和I

    2024年02月12日
    浏览(31)
  • 接下来和大家介绍ai绘画软件哪个好

    嘿,你好啊!这几天我发现了一个很酷的东西,就是那些可以使用ai技术帮助我们绘制动物的软件!它们真的是太神奇了!不仅可以让我们的绘画技能大大提升,而且还能够让我们创造出想象中的奇妙动物。但是,市面上有这么多的ai动物绘画软件,该选哪一个呢?今天,我就

    2024年02月12日
    浏览(29)
  • 马上五一了,带大家玩一下五子棋——C语言

    因为这篇博文实在五一这天完成的,所以呢,在介绍五子棋之前,先祝各位支持小白的大佬都五一快乐! 花了点时间下了个“五一快乐”的五子棋,哈哈哈哈哈哈,还不太熟练,所以写的有点丑,勉强过的去就行,不知道佬们看不看得出来,还是说实在一点都不像,不过没关

    2024年02月02日
    浏览(24)
  • 【MySql】如何重置MySQL数据库表中的id

     方法一:原来的id取消自增和主键,只用于表格的排序。 新插入一个id2,自然会根据自增重新排列。删除id,id2改id即可。 使用这种方法不影响表中数据,从1递增开始递增 方法二:清空表,并重置id 一次性删除所有数据,不可恢复,无法回滚  方法三: 方法四:

    2024年02月12日
    浏览(38)
  • 和大家分享一下学习清风老师的数学建模课的过程

    作为一名大一数学系的新生,就读于某中上游985大学,为了锻炼自己的能力和为以后保研做准备,所以想参加数学建模大赛,于是便早早的组好了队友,想着早起的鸟儿有虫吃,起初是在学长学姐的建议下买了司守奎老师的《数学建模算法与应用》想着看书自学大干一番,可

    2024年04月25日
    浏览(23)
  • 今天给大家介绍一下华为智选手机与华为手机的区别

    华为智选手机是由华为品牌方与其他公司合作推出的手机产品,虽然其机身上没有“华为”标识,但是其品质和技术水平都是由华为来保证的。这些手机在制造、设计和使用方面都采用了华为的相关技术和标准,因此可以享受到和华为旗舰手机相同的优质使用体验。    目前

    2024年02月09日
    浏览(37)
  • 今天跟大家好好介绍一下接口工具(jmeter、postman、swagger等)

    一、接口都有哪些类型? 接口一般分为两种:1.程序内部的接口 2.系统对外的接口 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把 数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用他提供的接口就能使用他写好的

    2024年02月05日
    浏览(42)
  • 做程序员累了想要转行?我想给大家分享一下看法

    今天早上起床时,我看到有粉丝评论说关于程序员的话题,如果做着觉得累了,就会觉得自己不适合这个工作,想转行。我想给大家分享一下我的看法。 在我刚开始工作时,有人说我不适合做这个工作,但是我坚持了下来,做了3年。一开始,我学习的专业技术上还可以,但

    2023年04月19日
    浏览(34)
  • MySQL 中的 distinct 和 group by 哪个效率更高?

    在语义相同,有索引的情况下:group by和distinct都能使用索引,效率相同。 在语义相同,无索引的情况下:distinct效率高于group by。原因是distinct 和 group by都会进行分组操作,但group by可能会进行排序,触发filesort,导致sql执行效率低下。 DISTINCT 用于返回唯一不同的值。

    2024年01月23日
    浏览(34)
  • Java项目中,MySQL数据库中的时间字段用哪个?

    1.timestamp:                 自带时区属性,该类型的字段会随着服务器时区的变化而变化,自动换算成相应时区的时间,存储形式为:yyyy-MM-dd HH:mm:ss,对应的Java类型为java.sql.Timestamp                 缺点:只能存储到2038年的时间。 2.datetime:                 不具备时区

    2024年02月10日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包