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

yizhihongxing

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以节省磁盘空间的建议

    当数据量庞大时,MySQL所占用的磁盘空间也随之增加。因此,几个缩减MySQL以节省磁盘空间的建议就尤为重要。 以下是一些缩减MySQL以节省磁盘空间的建议: 1. 使用TINYINT代替BOOLEAN 在MySQL中,BOOLEAN会以1字节的形式存储。然而,TINYINT可以用1位就能存储,所以使用TINYINT可以大大节省磁盘空间。 例如,当一个表中有…

    MySQL 2023年5月19日
    00
  • 教你一招永久解决mysql插入中文失败问题

    下面是“教你一招永久解决mysql插入中文失败问题”的完整攻略。 问题描述 在使用mysql数据库时,我们常常会遇到将中文数据插入到数据库中失败的问题。这是由于mysql默认编码为latin1,无法直接存储中文编码。如果不进行设置,插入中文数据时会报错。那么如何解决这个问题呢?接下来,我将介绍一种通用的解决方案。 解决方案 步骤一:更改数据库的编码 将mys…

    MySQL 2023年5月18日
    00
  • MySQL优化GROUP BY(松散索引扫描与紧凑索引扫描)

    MySQL中的GROUP BY语句可以用于将相似的数据分组并计算其汇总值。但是,当数据集很大时,GROUP BY语句对性能的影响也会很大。本文将详细讲解如何通过松散索引扫描和紧凑索引扫描来优化MySQL中的GROUP BY语句。 松散索引扫描优化 在MySQL中,使用GROUP BY语句分组时,如果不指定排序(ORDER BY)的话,MySQL会随机选择一个…

    MySQL 2023年5月19日
    00
  • 关于 MySQL 嵌套子查询中,无法关联主表字段问题的折中解决方法

    今天在工作中写项目的时候,遇到了一个让我感到几乎无解的问题,在转换了思路后,想出了一个折中的解决方案,记录如下。 其实,问题的场景,非常简单: 就是需要查询出上图的数据,红框是从 项目产品表 中查询的2个字段,绿框是从与项目产品表关联的 文章表 中查询出的1个字段。我希望实现的效果是,获取到项目产品对应的文章提交人数,即该项目产品,有多少人提交了文章。看似很…

    MySQL 2023年4月12日
    00
  • DBA必备的Mysql知识点:数据类型和运算符

    摘要:本文主要为大家带来Mysql中的3种数据类型和3种运算符。 本文分享自华为云社区《Mysql中的数据类型和运算符》,作者: 1+1=王。 Mysql的数据类型 Mysql支持数值型、文本型和日期时间型三大数据类型。 数值型数据 数值型是描述定量数据的数据类型,包括整数型数据类型和浮点型数据类型。 整数型数据类型 整数型数据类型包括INTEGER、SMA…

    MySQL 2023年4月11日
    00
  • MySQL下的RAND()优化案例分析

    下面我将为你详细讲解MySQL下的RAND()优化案例分析的完整攻略,并给出两个示例说明。 案例分析 1. RAND()函数的问题 MySQL中的RAND()函数可以用来生成随机数,但它有着很大的问题:性能低下。当数据量比较大时,使用RAND()函数查询数据将会变得非常慢。 下面的例子展示了一个简单的使用RAND()函数查询数据的语句: SELECT * F…

    MySQL 2023年5月19日
    00
  • mysql server is running with the –skip-grant-tables option

    当我们使用MySQL数据库时,有时候可能会遇到”mysql server is running with the –skip-grant-tables option”的提示信息。这种提示信息的意思是MySQL服务器正在运行时跳过了授权表。通常这种情况发生在我们忘记MySQL的root密码时,因为授权表的内容包括用户名和密码。 针对这种情况,整理了以下针对U…

    MySQL 2023年5月18日
    00
  • Windows系统下MySQL无法启动的万能解决方法

    以下是针对Windows系统下MySQL无法启动的万能解决方法的完整攻略: 问题描述 在Windows系统下,有时候我们会遇到MySQL无法启动的问题,具体表现为:在MySQL服务启动时,控制台报错提示“Error 1067: The process terminated unexpectedly.”。这时候我们需要采取相关措施来解决该问题。 解决方法 1.…

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