效率count(*)=count(1)>count(id)>count(字段)(基于 innodb)

以下内容基于常用的 innodb 存储引擎
执行效率 count(*)=count(1)>count(id)>count(字段)

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

1、count( * )的 * 并不是指数据表的所有列,这个是误解。
count( * ) 底层执行时会被转化为 count(0),与 count(1) 执行效果一样。
count(1) 1这个参数一直不会等于null,所以相当于统计数据表的行数。

2、count( * )、 count(1)、 count( id ) 在执行的时候,如果表里存在二级索引,优化器就会选择二级索引进行扫描。
所以,如果要执行 count(1)、 count(*)、 count(主键字段) 时,尽量在数据表上建立二级索引,这样优化器会自动采用 key_len 最小的二级索引进行扫描,相比于扫描主键索引效率会高一些。
count( * ),count(1)底层不回去取数据出来判断是否为空,直接判断"1"不为空,累计加一。
count(id),需要去取id出来,再判断,不为空才加一。
再来,就是不要使用 count(字段) 来统计记录个数,因为它的效率是最差的,会采用全表扫描的方式来统计。如果你非要统计表中该字段不为 NULL 的记录个数,建议给这个字段建立一个二级索引。

详细讲解:https://mp.weixin.qq.com/s/foPwJPS8Ek7YmR3ZgV8xMw

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计数(count)数据库中的记录可以使用MySQLcount()函数。count()函数有几种用法,包括count(*)、count(字段)和count(常量)。count(*)用于统计所有行数,count(字段)用于统计该字段不为null的数据,count(常量)与count(*)类似,效率也基本上一致。\[1\] 对于MyISAM引擎,它的锁是表级锁,同一张表上的操作是串行完成的。为了优化count(*)查询表的总行数,MyISAM引擎会将表的总行数单独记录下来,当查询表的总行数时,直接返回这个记录下来的数值即可。前提是查询没有where条件,并且MyISAM数据库没有并发的行数修改,这样查询得到的行数是准确的。\[2\] 而对于InnoDB引擎,它的大部分操作是行级锁,不能像MyISAM那样简单地记录表的总行数。在查询行数时,InnoDB会选择一个成本较低的索引进行扫表,以统计行数并节省空间。通常会选择最小的非聚簇索引来扫表。\[3\] 对于COUNT(1)和COUNT(*)来说,MySQL的优化是完全一样的,不存在谁比谁快的问题。建议使用COUNT(*),因为这是SQL92中定义的标准统计行数的语法。而COUNT(字段)查询比较简单粗暴,会进行全表扫描,判断指定字段是否为NULL,不为NULL则累加。因为多了一个判断NULL的操作,所以效率会比COUNT(*)慢一些。\[3\] 综上所述,计数(count)数据库中的记录可以使用MySQLcount()函数,具体使用方式取决于表的引擎和查询的需求。 #### 引用[.reference_title] - *1* [MySQL-带条件计数COUNT](https://blog.csdn.net/qq_43501821/article/details/129266616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MySQL 数据库统计函数 COUNT](https://blog.csdn.net/weixin_45505313/article/details/102716183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据库count语句解读](https://blog.csdn.net/white_zzZ/article/details/104106558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值