Count( ? ) 效率的比较

本文对比了InnoDB和MyISAM存储引擎下`count(*)`与`count(1)`的执行效率,指出InnoDB通过全表扫描计数,而MyISAM利用元信息加速。同时,强调了在InnoDB中使用二级索引优化`count(字段)`的重要性。
摘要由CSDN通过智能技术生成

Count( ? ) 效率的比较

count(*) count(1) count(具体字段)

引言1:

对于count(*)和count(1)虽然在性能上会有一点不同,但总体上可以看成二者的执行效率是相同的。 如果有where判断,则统计的是符合过滤后剩下的行数,如果没有where判断,则统计的是全表的行数

引言2:

对于MyISAM存储引擎,统计一张表的所有行数只需要O(1)的时间复杂度,因为myisam存储引擎为每一张表配置了一个meta信息存储了每一张表的row_count值,一致性是由表级锁来保证

  • 如果是innodb存储引擎,由于支持事务,并且采用的是 行级锁粒度和MVCC机制,所以无法向myisam一样,维护一个row_count变量,所以innodb要进行全表扫描,时间复杂度为O(n)

    进行循环+计数的方式完成统计

  • 在innodb存储引擎中,如果采用count(字段)来统计行数,尽量采用二级索引,因为逐渐采用的是聚簇索引,聚簇索引存储的信息明显大于二级所以你所存储的信息(非聚簇索引),而对于**count(*)和count(1) 他们不需要查具体的行,只会从机行数,系统会自动选择占用空间小的二级所以你来完成统计**

  • 如果有多个二级索引,系统会使用 key_len 小的二级索引从机行数,当没有二级索引的时候,才会根据主键来统计行数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值