技术编程|COUNT(*) 和 COUNT(1)哪个效率更高?
文章图片
文章图片
在MySQL InnoDB存储引擎中 , COUNT(*)和COUNT(1)都是对的所有结果进行的COUNT 。如果有WHERE子句 , 则是对所有符合筛选条件的数据行进行统计 。如果没有WHERE子句 , 则是对数据表的数据行数进行统计 。
因此COUNT(*)和COUNT(1)本质上没有区别 , 执行的复杂度都是O(N) , 也就是采用全表扫描 , 进行循环+计数的方式进行统计 。
如果是MySQL MyISAM存储引擎 , 统计数据表的行数只需要O(1)复杂度 , 这是因为每张MyISAM的数据表都有一个meta信息有存储了row_count值 。而一致性由表级锁来保证 。而InnoDB支持事务 , 采用行级锁和MVCC机制 , 所以无法像MyISAM一样 , 只维护一个row_count变量 。因此就需要采用扫描全表 , 进行循环+计数的方式来完成统计 。
需要注意的是 , 在实际执行中COUNT(*)和COUNT(1)执行时间可能略有差别 , 不过你还是可以把这两个在执行效率上看成是相等的 。
另外在InnoDB引擎中 , 如果是采用COUNT(*)和COUNT(1)来统计数据行数 , 要尽量采用二级索引 。
因为主键采用的索引是聚簇索引 , 聚簇索引包含的信息多 , 明显会大于二级索引(非聚簇索引) 。
对于查找具体的行来说 , 采用主键索引效率更高 。而对于COUNT(*)和COUNT(1)这种 , 不需要查找具体的行 , 只是统计行数来说 , 系统会自动采用占用空间更小的二级索引来进行统计 。
如果有多个二级索引的时候 , 会使用key_len小的二级索引进行扫描 。当没有二级索引的时候 , 才会采用主键索引来进行统计 。
文章图片
文章图片
优化总结:
【技术编程|COUNT(*) 和 COUNT(1)哪个效率更高?】1、一般情况下:COUNT(*) = COUNT(1) > COUNT(字段)
所以尽量使用COUNT(*) , 当然如果你要统计的是就是某个字段的非空数据行数 , 那另当别论 。毕竟执行效率比较的前提是要结果一样才行 。
2、如果要统计COUNT(*) , 尽量在数据表上建立二级索引 , 系统会自动采用key_len小的二级索引进行扫描 , 这样当我们使用SELECT COUNT(*)的时候效率就会提升 , 有时候提升几倍甚至更高都是有可能的 。
推荐阅读
- 行业互联网|华为 | 车载以太网物理层及TSN发展现状 与技术趋势
- 技术编程|什么是Plesk虚拟主机控制面板?
- 电池技术|法国发明出世界最快的电极:可将锂电池的密度提高3倍
- 技术编程|人工智能在大视频运维中如何实现CDN硬盘故障预测?
- 电池技术|关于惠州赣锋建设高端聚合物锂电池研发及生产基地建设,赣锋锂业要干大事
- |加速冲刺世界级技术领先地位,大族机器人获1.65亿元A轮融资
- 解码器|苹果 ProRes 视频编解码器获 2020 技术工程艾美奖
- 数据|徐叶润:另类数据技术是驱动资管科技的核心
- 中年|《经济学人》封面文章解析蚂蚁集团:数字技术的崛起代表了金融的未来
- 行业互联网|北科院轻工所技术入选中关村论坛技术交易大会“产业创新领先技术百强项目榜单”