首页 > 数据库 >对于MySQL的innodb存储引擎,‘select count(*) ’、‘select count(id)’、‘select count(1) ’这三个sql有什么区别?

对于MySQL的innodb存储引擎,‘select count(*) ’、‘select count(id)’、‘select count(1) ’这三个sql有什么区别?

时间:2023-08-16 16:59:20浏览次数:39  
标签:count 查询 sql table NULL id select

让我们重新审视那三个查询在 InnoDB 存储引擎中的行为:

  1. select count(*) from table;

    这个查询用于计算表中的所有行数。当使用 count(*) 时,MySQL 不会去检查列的值,它只关心行数。对于 InnoDB,这并不意味着它可以从某个内部计数器快速获取行数,而是需要对整个表或满足查询条件的相关部分进行扫描。

  2. select count(id) from table;

    这个查询计算具有非 NULL id 值的行数。如果 id 列是定义为 NOT NULL 的,那么这个查询的结果与 count(*) 会相同。但是,这个查询的意图是计算特定列的非 NULL 值的数量,所以它会检查 id 列的每一行来确定其值是否为 NULL。与 count(*) 类似,除非有适当的索引,否则这可能需要扫描整个表或查询条件的相关部分。

  3. select count(1) from table;

    这个查询在功能上与 count(*) 相同。它的目的是计算表中的行数,而不考虑任何特定列的值。count(1) 本质上是对每一行计数,不关心任何列的具体值。

总结:

  • 对于 InnoDB 存储引擎,以上三种查询可能都需要扫描表的整个内容或其相应的部分(除非有适当的索引来帮助优化查询),因为 InnoDB 不维护一个预存储的行数计数器。
  • 如果你只关心表中的行数,select count(*) from tableselect count(1) from table 在语义上是等价的,你可以选择其中之一。
  • 如果你关心特定列中的非 NULL 值数量,那么 select count(column_name) from table 是合适的选择。

对于性能考虑,总是建议在实际的环境和数据集上进行基准测试。

标签:count,查询,sql,table,NULL,id,select
From: https://www.cnblogs.com/shamo89/p/17635525.html

相关文章

  • 为什么MySQL innodb的数据达到亿级别,使用‘select count(*) ’将会特别慢?
    当表的数据达到亿级别时,使用SELECTCOUNT(*)FROMtable会变得特别慢,主要是因为以下几个原因:全表扫描:SELECTCOUNT(*)FROMtable通常会导致全表扫描,除非有一些优化手段被应用(例如使用覆盖索引)。当你执行这样的查询,数据库实际上需要读取表中的每一行以计算总......
  • MySQL 8.0 参考手册——8.2优化 SQL 语句
    数据库应用程序的核心逻辑是通过SQL语句来执行的,无论是通过解释器直接发出还是通过API在后台提交。本节中的调整指南有助于提高各种MySQL应用程序的速度。指南涵盖读写数据的SQL操作、一般SQL操作的幕后开销,以及数据库监控等特定场景中使用的操作。一、优化 SELECT ......
  • mysql安全设置
    ##securitysettingplugin-load-add=connection_control.soconnection-control=FORCEconnection-control-failed-login-attempts=FORCEconnection_control_min_connection_delay=3600000connection_control_max_connection_delay=3600000connection_control_failed......
  • MySQL 8.0 参考手册——优化
    8.1优化概述数据库性能取决于数据库级别的几个因素,例如表、查询和配置设置。这些软件结构在硬件级别上产生CPU和I/O操作,您必须最小化和尽可能有效地进行这些操作。在改进数据库性能时,您首先应学习软件的高级规则和指南,并使用执行时间测量性能。随着您成为专家,您将了解更多内部发......
  • MySQL之Explain
    执行计划输出中各列详解tableEXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该表的表名这个查询语句只涉及对sys_user表的单表查询,所以EXPLAIN输出中只有一条记录,其中的table列的值是sys_user,表明这条记录是用来说明对sys_user表的单表访问......
  • mysql 5.6 升级到 5.7 教程
    一、下载mysql5.7包  链接:https://pan.baidu.com/s/1ZBA1P6Yxq1clWS1ZZ9YzMw?pwd=yknx提取码:yknx 将下载文件解压后创建mysql.ini,并放入以下内容[mysqld]event_scheduler=onport=3306basedir=D:\mysql\XXXdatadir=D:\mysql\XXX\datamax_connection......
  • MySQL8.0 JSON的对比、排序和索引
    (目录)JSON的对比和排序JSON值可以通过=,<,<=,>,>=,<>,!=,<=>操作符来进行对比JSON不支持BETWEEN,IN(),GREATEST(),LEAST(),可以通过将JSON转换为其他数据类型来使用这些操作符。JSON值的对比在两个级别上进行,先进行数据类型的对比,如果类型相同,再进行值的对比。类型可以......
  • SQL_配置sql server数据库路径的小妙招
    配置sqlserver数据库路径的小妙招在桌面上建立一个文本文件,将后缀改成“.udl”,再次打开就可以看到一个图形化的SQL配置界面,根据界面提示就配置好,测试连接成功后,再用记事本打开,复制里面的配置信息就OK了。 ......
  • SQLite与Mysql的语句区别
     SQLite中,TEXT是一个通用的字符数据类型,能够存储任何长度的字符串,类似于MySQL的VARCHAR(255)。INTEGER是一个通用的整数数据类型。 此外,SQLite默认情况下是区分大小写的,而MySQL在utf8_general_ci下不区分大小写。如果需要在SQLite中进行不区分大小写的搜索,可以在LIKE操作符中使......
  • SELECT ''应收债权(违约债)'' AS C_NAME,
    SELECT''应收债权(违约债)''ASC_NAME,A.N_HLDMKV_LOCLFROMT_FINANCIAL_VALAWHEREA.D_BIZ=TO_DATE(:D_CURRENT_DATE,''YYYYMMDD'')ANDA.C_PORT_CODE......