当前位置: 首页 > news >正文

MySQL高级-SQL优化- count 优化 - 尽量使用count(*)

文章目录

  • 1、count 优化
  • 2、count的几种用法
  • 3、count(*)
  • 4、count(id)
  • 5、count(profession)
  • 6、count(null)
  • 7、 count(1)

1、count 优化

  • MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;
  • InnoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

优化思路:自己计数。

count(主键):InnoDB引擎会遍历整张表,把每一行的 主键id 值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)
count(字段):没有not null约束,InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。有not null约束,InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。
count(1):InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字”1“进行,直接按行进行累加。
count(*):InnoDB引擎并不会把全部字段取出来,而是专门做了优化。不取值,服务层直接按行累加。

按照效率排序的话,count(字段)< count(主键id)< count(1)约等于 count(*),所有尽量使用count(*)。

2、count的几种用法

  • count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是null,累计值就加1,否则不加,最后返回累计值。
  • 用法:count(*)、count(主键)、count(字段)、count(1)

3、count(*)

mysql> select count(*) from tb_user;
+----------+
| count(*) |
+----------+
|       24 |
+----------+
1 row in set (0.00 sec)mysql>

4、count(id)

mysql> select count(id) from tb_user;
+-----------+
| count(id) |
+-----------+
|        24 |
+-----------+
1 row in set (0.00 sec)mysql>

5、count(profession)

mysql> select count(profession) from tb_user;
+-------------------+
| count(profession) |
+-------------------+
|                24 |
+-------------------+
1 row in set (0.00 sec)mysql> update tb_user set profession=null where id =24;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select count(profession) from tb_user;
+-------------------+
| count(profession) |
+-------------------+
|                23 |
+-------------------+
1 row in set (0.00 sec)mysql>

6、count(null)

mysql> select count(null) from tb_user;
+-------------+
| count(null) |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)mysql>

7、 count(1)

mysql> select count(1) from tb_user;
+----------+
| count(1) |
+----------+
|       24 |
+----------+
1 row in set (0.00 sec)mysql>

在这里插入图片描述

相关文章:

  • 日常生活中应用广泛的长度单位(知道了解即可)
  • 安卓手机软件自动运行插件的开发流程及代码科普!
  • 【高考志愿】冶金工程
  • 深入解析Android DEX文件及其优化策略
  • uniapp横屏移动端卡片缩进轮播图
  • Qt | 2D 时钟设计
  • 基于uniapp(vue3)H5附件上传组件,可限制文件大小
  • Django QuerySet对象,all()方法
  • vue3+vite+nodejs,通过接口的形式请求后端打包(可打包全部或指定打包组件)
  • web的学习和开发
  • 面试专区|【40道移动端测试高频题整理(附答案背诵版)】
  • Android 生成 AAR 包
  • 论文学习_UVSCAN: Detecting Third-Party Component Usage Violations in IoT Firmware
  • 硬件工程师干了一年,公司无效卷,怎么破?
  • 手机数据恢复篇:恢复出厂设置后从iPhone快速恢复数据
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 「面试题」如何实现一个圣杯布局?
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Android开源项目规范总结
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS盒模型深入
  • go语言学习初探(一)
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Python3爬取英雄联盟英雄皮肤大图
  • Solarized Scheme
  • ubuntu 下nginx安装 并支持https协议
  • Vue ES6 Jade Scss Webpack Gulp
  • 后端_ThinkPHP5
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 思维导图—你不知道的JavaScript中卷
  • 【云吞铺子】性能抖动剖析(二)
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​ArcGIS Pro 如何批量删除字段
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (poj1.2.1)1970(筛选法模拟)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (强烈推荐)移动端音视频从零到上手(上)
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转) 深度模型优化性能 调参
  • (转载)Google Chrome调试JS
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET基础篇——反射的奥妙
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @Bean, @Component, @Configuration简析
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @JsonSerialize注解的使用
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [20171102]视图v$session中process字段含义
  • [20190113]四校联考
  • [AI Google] Ask Photos: 使用Gemini搜索照片的新方法