首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

"SELECT COUNT(列)"比"SELECT COUNT(*)"更快/更慢吗?

在数据库查询中,"SELECT COUNT(列)"和"SELECT COUNT(*)"是用来统计表中数据行数的两种常见方式。它们的性能表现会受到多个因素的影响,包括数据库引擎、表的大小、索引的使用等。

一般情况下,"SELECT COUNT(列)"比"SELECT COUNT()"更快。这是因为"SELECT COUNT(列)"只统计指定列非空的行数,而"SELECT COUNT()"会统计所有行数,包括空行。因此,当表中存在大量空行时,"SELECT COUNT(列)"可以减少不必要的计算,提高查询效率。

然而,也有一些特殊情况下"SELECT COUNT()"可能更快。例如,当表中的列都定义了索引时,数据库引擎可以直接利用索引来统计行数,而不需要扫描实际的数据行。在这种情况下,"SELECT COUNT()"和"SELECT COUNT(列)"的性能差异可能不大。

总结起来,对于大多数情况,推荐使用"SELECT COUNT(列)"来统计行数,以提高查询效率。但在特殊情况下,可以根据实际情况选择使用"SELECT COUNT(*)"。腾讯云提供的数据库产品包括云数据库 TencentDB,您可以根据具体需求选择适合的数据库产品。详情请参考腾讯云数据库产品介绍:腾讯云数据库

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

select count(*)、count(1)、count(主键)和count(包含空值的)有何区别?

下班路上看见网上有人问一个问题: oracle 10g以后count(*)和count(非空)性能方面有什么区别?...首先,准备测试数据,11g库表bisal的id1是主键(确保id1为非空),id2包含空值, ?...我们分别用10053打印如下4组SQL的trace, SQL1:select count(*) from bisal; SQL2:select count(1) from bisal; SQL3:select...count(id1) from bisal; SQL4:select count(id2) from bisal; 我们来看下这四个SQL的执行结果, ?...总结: 11g下,通过实验结论,说明了count()、count(1)和count(主键索引字段)其实都是执行的count(),而且会选择索引的FFS扫描方式,count(包含空值的)这种方式一方面会使用全表扫描

3.3K30

Select count(*)、Count(1)、Count(0)的区别和执行效率比较

count()的执行效率count(col)高,因此可以用count()的时候就不要去用count(col)。...count(col)的执行效率count(distinct col)高,不过这个结论的意义不大,这两种方法也是看需要去用。...如果是对特定的count的话建立这个的非聚集索引能对count有很大的帮助。 如果经常count()的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。...在不加WHERE限制条件的情况下,COUNT()与COUNT(COL)基本可以认为是等价的; 但是在有WHERE限制条件的情况下,COUNT()会比COUNT(COL)快非常多; count(0)=...count(1)=count(*) count(指定的有效值)--执行计划都会转化为count(*) 如果指定的是列名,会判断是否有null,null不计算 当然,在建立优化count的索引之前一定要考虑新建立的索引会不会对别的查询有影响

1.2K20
  • select count(*) 底层究竟做了什么?

    计数一行: Evaluate_join_record与是否为空,介绍计数过程如何影响 COUNT( * )结果。...简单来说,COUNT(arg) 本身为 MySQL 的函数操作,对于一行来说,若括号内的参数 arg ( 某或整行 )的值若不是 NULL,则 count++,否则对该行不予计数。...Q:对于SELECT COUNT( * ) FROM t或者SELECT MIN(id) FROM t操作,第一次的读行操作读到的是表 t 中 ( B+ 树最左叶节点 page 内 ) 的最小记录?...2.4 evaluate_join_record 与是否为空 Q:某一行如何计入 count?...A:两种情况会将所读的行计入 count: 1、如果 COUNT 函数中的参数是某,则会判断所读行中该定义是否 Nullable以及该的值是否为 NULL;若两者均为是,则不会计入 count,否则将计入

    1.3K30

    select count(*)底层究竟做了什么?

    计数一行: Evaluate_join_record与是否为空,介绍计数过程如何影响 COUNT( * )结果。...简单来说,COUNT(arg) 本身为 MySQL 的函数操作,对于一行来说,若括号内的参数 arg ( 某或整行 )的值若不是 NULL,则 count++,否则对该行不予计数。...Q:对于SELECT COUNT( * ) FROM t或者SELECT MIN(id) FROM t操作,第一次的读行操作读到的是表 t 中 ( B+ 树最左叶节点 page 内 ) 的最小记录?...2.4 evaluate_join_record 与是否为空 Q:某一行如何计入 count?...A:两种情况会将所读的行计入 count: 1、如果 COUNT 函数中的参数是某,则会判断所读行中该定义是否 Nullable以及该的值是否为 NULL;若两者均为是,则不会计入 count,否则将计入

    1.2K40

    select count(*) 底层究竟做了什么?

    计数一行: Evaluate_join_record与是否为空,介绍计数过程如何影响 COUNT( * )结果。...简单来说,COUNT(arg) 本身为 MySQL 的函数操作,对于一行来说,若括号内的参数 arg ( 某或整行 )的值若不是 NULL,则 count++,否则对该行不予计数。...Q:对于SELECT COUNT( * ) FROM t或者SELECT MIN(id) FROM t操作,第一次的读行操作读到的是表 t 中 ( B+ 树最左叶节点 page 内 ) 的最小记录?...2.4 evaluate_join_record 与是否为空 Q:某一行如何计入 count?...A:两种情况会将所读的行计入 count: 1、如果 COUNT 函数中的参数是某,则会判断所读行中该定义是否 Nullable以及该的值是否为 NULL;若两者均为是,则不会计入 count,否则将计入

    2.2K20

    故障分析 | MySQL 优化案例 - select count(*)

    500w 左右的表做 select count(*) 速度特别慢。...count(*) from api_runtime_log; 我们先去运行一下这条 SQL,可以看到确实运行很慢,要 40 多秒左右,确实很不正常~ mysql> select count(*) from...存储引擎下的表都有一个特殊的索引用来保存每一行的数据,称为聚簇索引(通常都为主键),聚簇索引实际保存了 B-Tree 索引和行数据,所以大小实际上约等于为表数据量 二级索引:除了聚集索引,表上其他的索引都是二级索引,索引中仅仅存储了对应索引及主键...因为二级索引只包含对应的索引及主键,所以体积非常小。在 select count(*) 的查询过程中,只需要将二级索引读取到内存缓冲区,只有几十 MB 的数据量,所以速度会非常快。...) mysql> select count(*) from test.sbtest1; +----------+ | count(*) | +----------+ | 5188434 | +--

    5.5K30

    听说count(8) count(*) 快好多,是真的

    央视有个黄西博士主持的节目,叫做《是真的?》,会以实验的方式验证一些奇奇怪怪的问题。 那我们今天就来验证一个神奇的事情:count(8) 会比count(*) 快很多倍,是真的?...非常神奇,5.33秒 VS 0.75秒,整整7倍的性能差距,难道就是因为一个少敲了一个shift键(为了娱乐效果,故意使用了count(8),等同于常见的count(1))。...如果我们再执行一次count(*),看看发生了什么: SQL> select count(*) from t10m; COUNT(*) ---------- 10000000 Elapsed:...因为老虎刘在一本书上看到一个优化案例,说是 sql1:select rowid from t_xxx where rownum<=1; 的性能要比 sql2:select count(1) from t_xxx...如果实验顺序是先执行sql1,再执行sql2,反而就会得出sql2的性能sql1好的结论来。

    37810

    踩坑实录Hive中select * 没有数据,而select count(*)有数据

    目录 背景 问题定位 原因1.压缩导致 解决方案 原因2.分区文件location不一致导致 解决方案 原因3.元数据未更新 解决方案 ---- 背景 hdfs文件有数据,Hive中select * 没有数据...,而select count(*)有数据 问题定位 原因1.压缩导致 表结构未压缩,数据压缩了,select查询与表结构有关系 解决方案 使用select时指定与数据一致的压缩方法就可以查询出来压缩过的收据了...set LOCATION='jfs://hd01-jfs/apps/hive/warehouse/db_name.db/table_name/ds=2022-05-27' ; 批量生成所有分区修改语句 select...join sds b on a.SD_ID=b.SD_ID where a.TBL_ID='502002' 原因3.元数据未更新 建表以location的方式加载数据,元数据没有记录新的数据,当执行 count...解决方案 set hive.compute.query.using.stats=true; 当hive.compute.query.using.stats=true时,select count(*) from

    74830

    不就是SELECT COUNT语句,居然有这么多学问!

    9、SELECT COUNT(*) 的时候,加不加where条件有差别? 10、COUNT(*)、COUNT(1)和COUNT(字段名)的执行过程是怎样的?...所以, COUNT(常量) 和 COUNT(*)表示的是直接查询符合条件的数据库表的行数。而COUNT(列名)表示的是查询符合条件的的值不为NULL的行数。...有的说COUNT(*)执行时会转换成COUNT(1),所以COUNT(1)少了转换步骤,所以更快。 还有的说,因为MySQL针对COUNT(*)做了特殊优化,所以COUNT(*)更快。...看下MySQL官方文档是怎么说的: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way....所以,对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁谁快! 那既然COUNT(*)和COUNT(1)一样,建议用哪个呢? 建议使用COUNT(*)!

    72730

    我说 SELECT COUNT(*) 会造成全表扫描,面试官让我回去等通知

    来源:码海 作者:码海 SELECT COUNT(*) FROM SomeTable SELECT COUNT(1) FROM SomeTable 原因是会造成全表扫描,有位读者说这种说法是有问题的,...EXPLAIN 来查询了一下执行计划 EXPLAIN SELECT COUNT(*) FROM SomeTable 结果如下 ?...随带提一句,COUNT(*)是 SQL92 定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT(*)查询表的行数! 所以这位读者的说法确实是对的。...这就比较有意思了,理论上采用了覆盖索引的方式进行查找性能肯定是全表扫描更好的,为啥 MySQL 选择了全表扫描呢,既然它认为全表扫描使用覆盖索引的形式性能更好,那我们分别用这两者执行来比较下查询时间吧...>'name84059' AND create_time>'2020-05-23 14:39:18' 从实际执行的效果看使用覆盖索引查询使用全表扫描执行的时间快了一倍!

    2.3K40

    我说 SELECT COUNT(*) 会造成全表扫描,面试官让我回去等通知

    前言 上篇 SQL 进阶技巧(下) 中提到使用以下 sql 会导致慢查询 SELECT COUNT(*) FROM SomeTable SELECT COUNT(1) FROM SomeTable 原因是会造成全表扫描...,我首先去生产上找了一个千万级别的表使用 EXPLAIN 来查询了一下执行计划 EXPLAIN SELECT COUNT(*) FROM SomeTable 结果如下 ?...随带提一句,COUNT(*)是 SQL92 定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT(*)查询表的行数! 所以这位读者的说法确实是对的。...这就比较有意思了,理论上采用了覆盖索引的方式进行查找性能肯定是全表扫描更好的,为啥 MySQL 选择了全表扫描呢,既然它认为全表扫描使用覆盖索引的形式性能更好,那我们分别用这两者执行来比较下查询时间吧...>'name84059' AND create_time>'2020-05-23 14:39:18' 从实际执行的效果看使用覆盖索引查询使用全表扫描执行的时间快了一倍!

    51820
    领券