MySQL中count()和count(1)有何区别以及哪个性能最好详解

MySQL中的count()和count(1)函数都可以用来计算查询结果集中的行数,但它们之间存在一些区别。

count()函数是用来计算查询结果中行的数量,并忽略值为NULL的列。如果使用count()函数时,只传入一个参数,则会计算该参数的值不为NULL的行数。如果传入多个参数,则会计算所有参数的值不为NULL的行数。

相比之下,count(1)函数通常用于性能优化。它会通过查找表中的第一列来判断行是否存在。因为第一列只会包含值,不会包含NULL,因此使用count(1)函数计算行数时,就可以避免处理NULL值了,从而提高计算速度。实际上,count(1)和count()的效果是一样的,只不过count()并不是直接使用第一个列,而是使用所有列。

经过测试,在普通情况下,count(1)的性能更优,因为它比count()函数更简洁、更方便。但如果你的查询中有大量的NULL值,或者有大量的列,那么使用count()函数可能会更快。

下面我们将通过两个示例来展示count()和count(1)函数之间的差异。

示例1

我们创建一个测试表,来测试两个函数效率:

CREATE TABLE test_table (
 id INT PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(255),
 val1 INT,
 val2 INT
);

INSERT INTO test_table (name, val1, val2)
SELECT CONCAT("name-", FLOOR(RAND() * 10000)), FLOOR(RAND() * 10000), FLOOR(RAND() * 10000)
FROM information_schema.columns
LIMIT 10000000;

然后我们执行以下两个查询:

SELECT COUNT(*) FROM test_table;

SELECT COUNT(1) FROM test_table;

测试结果,使用count()的查询时间为2.068s,使用count(1)的查询时间为2.163s。在这个测试表中,count()的效率略高于count(1)。

示例2

我们再创建一个测试表,并将其中一列定义为允许NULL值,来比较count()和count(1)的效率差异。实现以下查询:

CREATE TABLE test_nulls (
 id INT PRIMARY KEY AUTO_INCREMENT,
 col1 INT,
 col2 INT,
 col3 INT,
 col4 INT,
 col5 INT,
 col6 INT,
 col7 INT,
 col8 INT,
 col9 INT,
 col10 INT,
 col11 INT,
 col12 INT,
 col13 INT,
 col14 INT,
 col15 INT,
 col16 INT,
 col17 INT,
 col18 INT,
 col19 INT,
 col20 INT
);

INSERT INTO test_nulls (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14, col15, col16, col17, col18, col19, col20)
SELECT
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 FLOOR(RAND() * 10000),
 NULL,
 FLOOR(RAND() * 10000)
FROM information_schema.columns
LIMIT 10000000;

然后我们执行以下两个查询:

SELECT COUNT(*) FROM test_nulls;

SELECT COUNT(1) FROM test_nulls;

测试结果,使用count()的查询时间为2.580s,使用count(1)的查询时间为2.513s。在这个测试表中,count(1)的效率略高于count()。由于该表中有NULL值,使用count()函数时会多次执行空值判断,从而拖慢计算速度。

综上,count()和count(1)仅在处理NULL值时有所不同,在性能方面的差异也与表的实际情况有关。在大多数情况下,使用count(1)会更加方便和高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL中count()和count(1)有何区别以及哪个性能最好详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 数据库:MySQL(多表的表记录的查询)(三)

    一、外键约束 1、创建外键 — 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 —-主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY KEY auto_increment, name VARCHAR (20), age INT , is_marriged boolean — show c…

    MySQL 2023年4月13日
    00
  • mysql分页性能探索

    下面我来详细讲解“mysql分页性能探索”的完整攻略。 1. 背景 MySQL是最流行的关系型数据库之一,被广泛应用于Web应用程序中。在实现分页查询时,需要考虑到分页的性能问题,避免对数据库的性能造成影响。 2. 分页查询 分页查询是指将一系列结果分为多个页面进行显示,每个页面包含指定数量的结果。在MySQL中,可以使用LIMIT关键字实现分页查询,例如:…

    MySQL 2023年5月19日
    00
  • 使用 Binlog 和 Canal 从 MySQL 抽取数据

    转载自: https://blog.csdn.net/zjerryj/article/details/77152226   技术点: Apache Sqoop Ali Canal https://github.com/alibaba/canal Hive 0.14 支持 insert update delete , 2.0 后支持 Streaming Mut…

    MySQL 2023年4月16日
    00
  • MySQL select count(*)计数很慢优化方案

    针对MySQL中的select count(*)计数很慢的问题,一般可以从以下几个方面入手进行优化。 1. 定位慢查询 首先需要通过查看日志、使用慢查询日志、show full processlist等工具来定位查询语句中具体哪一步执行的时间较长。 2. 分析查询语句 针对定位到的慢查询,需要进行仔细的语句分析。通常需要检查下面几点: 查询使用的索引 查询字…

    MySQL 2023年5月19日
    00
  • navicat连接mysql时出现1045错误的解决方法

    下面是“navicat连接MySQL时出现1045错误的解决方法”的完整攻略: 问题描述 使用Navicat连接MySQL数据库时,可能会遇到以下错误提示: 1045 – Access denied for user ‘user_name’@’localhost’ (using password: YES) 这种问题通常是由于用户名或密码错误导致的,也可能是…

    MySQL 2023年5月18日
    00
  • MySQL数据类型DECIMAL用法

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。 要定义数据类型为DECIMAL的列,请使用以下语法: 1 column_name  DECIMAL(P,D); 在上面的语法中: P是表示有效数字数的精度。 P范围为1〜65。 D是表示小数点后的位数。 D的范围…

    MySQL 2023年4月13日
    00
  • mysql中已经存在某个库中有大小写的表,将lower_case_table_names由0改为1对已经存在的表是否有影响?

    需求描述:   今天遇到了修改lower_case_table_names参数的问题,想了下,如果原来里面有表,表名有大小写的,   如果将lower_case_table_names从默认的0改为1之后,那么对于原来的表有没有影响.做个实验,在此   记录下. 操作过程: 1.原来未修改之前,库中创建大小写区分的表 mysql> drop datab…

    MySQL 2023年4月13日
    00
  • MySQL的一条慢SQL查询导致整个网站宕机的解决方法

    当网站中出现慢SQL查询导致网站宕机的情况时,我们可以采用以下方法进行解决: 1. 发现问题 在网站发生宕机的状况下,首先需要我们去查找原因,可以通过以下方法查找: 查看MySQL的慢查询日志 在MySQL中,我们可以开启慢查询日志,记录下执行时间超过指定时间的SQL语句。通过查看慢查询日志,我们可以发现那些执行时间特别长的SQL语句,从而快速定位问题。 如…

    MySQL 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部