首页 > 数据库 >mysql 中count(*)和count(1)、count(0)谁的效率更高???

mysql 中count(*)和count(1)、count(0)谁的效率更高???

时间:2024-12-04 16:00:47浏览次数:10  
标签:count COUNT OK users 更高 -- EXPLAIN mysql SELECT

在 MySQL 中,COUNT(*)COUNT(1)COUNT(0) 在大多数情况下具有相似的性能表现。这是因为 MySQL 的查询优化器通常能够识别这些不同的计数方式并将其优化为相同的执行计划。具体来说:

  • COUNT(*): 计算表中的总行数。

  • COUNT(1): 计算表中非空值的数量,但由于 1 是一个常量且总是非空,实际上它等同于计算总行数。

  • COUNT(0): 同样地,

    性能比较

  • 执行计划:

    • 当你使用 EXPLAIN 关键字查看查询的执行计划时,你会发现 COUNT(*)COUNT(1) 和 COUNT(0) 通常会产生相同的执行计划。
  • 实际性能:

    • 在大多数现代版本的 MySQL 中,这三种计数方式在性能上几乎没有差异。MySQL 的查询优化器会将它们视为相同的操作
  • 0 是一个常量且总是非空,因此这也等同于计算总行数。

    -- 创建用户表
    CREATE TABLE users (
      id INT PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(100) NOT NULL UNIQUE,
      email VARCHAR(100) NOT NULL UNIQUE,
      password VARCHAR(255) NOT NULL
    );
    
    -- 插入用户数据
    INSERT INTO users (username, email, password) VALUES
    ('john_doe', 'john@example.com', 'password123'),
    ('jane_smith', 'jane@example.com', 'password456');
    
    -- 使用 COUNT(*)
    SELECT COUNT(*) AS count_star FROM users;
    
    -- 使用 COUNT(1)
    SELECT COUNT(1) AS count_one FROM users;
    
    -- 使用 COUNT(0)
    SELECT COUNT(0) AS count_zero FROM users;
    
    -- 查看 EXPLAIN 计划
    EXPLAIN SELECT COUNT(*) FROM users;
    EXPLAIN SELECT COUNT(1) FROM users;
    EXPLAIN SELECT COUNT(0) FROM users;
    第一次
    
    -- 使用 COUNT(*)
    SELECT COUNT(*) AS count_star FROM users
    > OK
    > 查询时间: 0.021s
    
    
    -- 使用 COUNT(1)
    SELECT COUNT(1) AS count_one FROM users
    > OK
    > 查询时间: 0.001s
    
    
    -- 使用 COUNT(0)
    SELECT COUNT(0) AS count_zero FROM users
    > OK
    > 查询时间: 0s
    
    
    -- 查看 EXPLAIN 计划
    EXPLAIN SELECT COUNT(*) FROM users
    > OK
    > 查询时间: 0.003s
    
    
    EXPLAIN SELECT COUNT(1) FROM users
    > OK
    > 查询时间: 0s
    
    
    EXPLAIN SELECT COUNT(0) FROM users
    > OK
    > 查询时间: 0s
  • 第二次
    -- 使用 COUNT(*)
    SELECT COUNT(*) AS count_star FROM users
    > OK
    > 查询时间: 0.002s
    
    
    -- 使用 COUNT(1)
    SELECT COUNT(1) AS count_one FROM users
    > OK
    > 查询时间: 0s
    
    
    -- 使用 COUNT(0)
    SELECT COUNT(0) AS count_zero FROM users
    > OK
    > 查询时间: 0s
    
    
    -- 查看 EXPLAIN 计划
    EXPLAIN SELECT COUNT(1) FROM users
    > OK
    > 查询时间: 0s
    
    
    EXPLAIN SELECT COUNT(0) FROM users
    > OK
    > 查询时间: 0s
    
    
    EXPLAIN SELECT COUNT(*) FROM users
    > OK
    > 查询时间: 0s

    性能几乎基本一样

标签:count,COUNT,OK,users,更高,--,EXPLAIN,mysql,SELECT
From: https://blog.csdn.net/m0_63197684/article/details/144242582

相关文章

  • Mysql 一主一从配置
    Mysql一主一从配置环境信息ip地址主机信息角色mysql版本192.168.1.19S600主8.0.40-0ubuntu0.20.04.1192.168.1.20H840从8.0.40-0ubuntu0.20.04.1本环境已完成2台Mysql单机安装,Mysql单机安装操作文档具体操作Mysql主机配置配置文件修改修改配置Mas......
  • Mycat2+Mysql一主一从实现读写分离配置
    Mycat2+Mysql一主一从实现读写分离配置前置配置Mysql一主一从搭建Mycat2环境搭建环境信息ip地址软件角色版本192.168.1.19Mysql主8.0.40-0ubuntu0.20.04.1192.168.1.19Mycat2——1.21-release-3-14192.168.1.20Mysql从8.0.40-0ubuntu0.20.04.1......
  • 如何更高效地完成项目?首先要做好信息资料整理
    无论是打工人,还是学生党,在文件管理时常常会面临一个问题:信息散乱,管理困难。各种项目文件、在线文档、图片等等,往往堆积在不同平台、不同格式中,导致信息碎片化严重,你可能用GoogleDocs做文档编辑、用Dropbox存储文件,还用Xmind做思维导图,每次要查找资料时,像是进入了一个信息迷宫,效率......
  • JAVA开源毕业设计 房屋租赁系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T020,文末自助获取源码\color{red}{T020,文末自助获取源码}......
  • JAVA开源毕业设计 大学生租房平台 Vue.JS+SpringBoot+MySQL
    本文项目编号T019,文末自助获取源码\color{red}{T019,文末自助获取源码}......
  • JAVA开源毕业设计 网上订餐系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T018,文末自助获取源码\color{red}{T018,文末自助获取源码}......
  • elastic8.4.0搜索+logstash<=>mysql实时同步+kibana可视化操作+netcore代码笔记
    做全文搜索,es比较好用,安装可能有点费时费力。mysql安装就不说了。主要是elastic8.4.0+kibana8.4.0+logstash-8.16.1,可视化操作及少了netcore查询代码。安装elastic8.4.0+kibana8.4.0使用docker-desktop,logstash-8.16.1是线程解压执行文件。1. docker-compose.yml如下:首先使......
  • Mysql高频面试题汇总
    Mysql高频面试题一.sql如何定位查询慢定义sql查询慢可以哈斯用相关的运维工具或者mysql自身提供的慢日志查询功能来实现,在我的项目当中也是采用了Skywalking链路追踪的中间件用来监控接口执行情况,在Skywalking中可以我们可以针对运行速度慢的接口进行查询,在其提......
  • MySQL语句学习第二篇_数据库
    专栏记录MySQL的学习,感谢大家观看。本章的专栏......
  • MYSQL数据库配置登录超时退出功能
    my.ini配置文件添加如下配置:[mysqld]plugin_load_add=connection_control.dllconnection_control=FORCE_PLUS_PERMANENTconnection_control_failed_login_attempts=FORCE_PLUS_PERMANENTconnection_control_failed_connections_threshold=3connection_control_max_connec......