MySQL count(*/column)查询优化的实现

 更新时间:2024年09月03日 09:55:34   作者:V1ncent Chen  
count()是SQL中一个常用的聚合函数,其被用来统计记录的总数,本文主要介绍了MySQL count(*/column)查询优化的实现,具有一定的参考价值,感兴趣的可以了解一下

count()是SQL中一个常用的聚合函数,其被用来统计记录的总数,下面通过几个示例来说明此类查询的注意事项及应用技巧。

一、count()的含义

count()用于统计符合条件的记录总数,但其有2种用法:count(*)和count(column)

  • count(*) 统计记录的总数
  • count(column) 统计column列不为空的记录总数

这里的概念可能和部分人的理解有些偏差,在SQL中“*”通常代表所有列,SQL会通过查询数据字典来将其解析为所有列名,而count(*)并不会这样做,它会是直接统计数量。而count(column)只有在column列不为空的情况下才与count(*)的查询结果相同,因此如果你想统计总记录数,那么直接使用count(*),count(column)的结果可能会与你想的不同。

示例:count(*)和count(column)的区别

create table test(
id int primary key auto_increment,
name varchar(32)
);
insert into test values(null, 'Vincent'), (null, null);
select * from test;

在这里插入图片描述

表中共2条记录,其中id为2的name是一个空值,查询count(*)和count(name)观察区别:

select count(*), count(name) from test;

在这里插入图片描述

二、count()的应用技巧

由于count()是一个聚合函数,因此它在统计时会扫描符合条件的所有记录,如果我们需要统计多项汇总数据,常规的SQL会一次次的扫描结果集,每次统计出一个结果,而利用一些技巧,我们可以一次扫描统计出多个汇总数据。

2.1 同时统计多列

首先改造一下测试数据,假设这是一张销售明细表,新增产品和价格列:

alter table test add product varchar(32), add price decimal(10,2);
truncate table test;
insert into test values(null,‘Vincent', ‘Table', 100),(null,‘Vincent', ‘Chair', 50),(null,‘Vincent', ‘Chair', 50),(null,‘Victor', ‘Table', 100),(null,‘Victor', ‘Chair', 50),(null,‘Victor', ‘Chair', 50),(null,‘Victor', ‘Chair', 50);
select * from test;

在这里插入图片描述

假设现在我有下列问题:

  • Vincent卖了几件商品?
  • Victor卖了几件商品?
  • 产品椅子总销量是多少(不分人员)?
  • 所有产品的销售总金额是多少?

由于这几个问题的分组条件都不同,无法用1个group by条件概括。按照常规思路,第1,2个问题应该是count(*)然后group by name,第三个问题应该是count(*) where product=‘Table’,最后在全表扫描一次求出sum(price),即总金额:

select name,count(*) from test group by name;
select count(*) from test where product='Chair';
select sum(price) from test;

在这里插入图片描述

虽然上面得到了4个问题的答案,但对表查询了3次,假设在生产环境这个表非常大,那么性能必然低下。稍微优化一下,我们可以用一次查询同时回答上面4个问题:

select 
count(name='Vincent' or null) Vincent的销量,
count(name='Victor' or null) Victor的销量,
count(product='Chair' or null) 椅子的总销量,
sum(price) 总销售金额
from test;

在这里插入图片描述

这里利用了count(column)不会统计null的特性,将条件转移到count()函数的内部,实现了一次扫描,多个维度统计。

2.2 利用执行计划

当表中的数据特别大,统计时间特别长,而我们需要的结果又不需要很精确时。可以通过执行计划来查看预估的数量,利用这种方式可以在不实际执行查询的结果下快速得到结果:

示例:统计表中某类数据的数量,直接通过执行计划查看,而不实际执行SQL:

explain select count(*) from test;

在这里插入图片描述

注意这种方法之适合不需要精确数字的场景,执行计划中的rows是根据统计信息估计出来的,而统计信息本来就是个采样值而且可能已经比较过时了,使用这个方法前可以先执行 analyze table tab_name; 更新一下统计信息。

到此这篇关于MySQL count(*/column)查询优化的实现的文章就介绍到这了,更多相关MySQL count(*/column)查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql中逻辑函数的具体使用

    mysql中逻辑函数的具体使用

    MySQL中逻辑函数包括IF、CASE、COALESCE、NULLIF和IFNULL,用于根据条件对数据进行判断和选择,适用于复杂的数据处理需求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • mysql 忘记密码的解决方法(linux和windows小结)

    mysql 忘记密码的解决方法(linux和windows小结)

    下面是linux和windows下mysql丢失密码的解决办法
    2008-12-12
  • MySQL时间戳与日期格式的相互转换

    MySQL时间戳与日期格式的相互转换

    在MySQL数据库中,时间戳和日期格式是常用的数据类型,在MySQL中,我们可以使用函数还相互转换时间戳和日期格式,下面我将详细的给大家介绍如何进行转换,并提供相应的代码示例,感兴趣的小伙伴跟着小编一起来看看吧
    2024-01-01
  • MySQL之information_schema数据库详细讲解

    MySQL之information_schema数据库详细讲解

    这篇文章主要介绍了MySQL之information_schema数据库详细讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • MySQL命令行导出与导入数据库

    MySQL命令行导出与导入数据库

    这篇文章主要为大家详细介绍了利用命令行MySQL导出数据库与导入数据库的例子,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • MySQL入门教程(五)之表的创建、修改和删除

    MySQL入门教程(五)之表的创建、修改和删除

    MySQL 为关系型数据库(Relational Database Management System), 本文给大家介绍MySQL入门教程(五)之表的创建、修改和删除,需要的朋友一起学习吧
    2016-04-04
  • MySQL七大JOIN的具体使用

    MySQL七大JOIN的具体使用

    本文主要介绍了MySQL七大JOIN的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • mysql索引失效的常见九种原因图文详解

    mysql索引失效的常见九种原因图文详解

    索引失效这个问题的前提应该是建立了索引,却没有使用到,或者没有完全使用到,下面这篇文章主要给大家介绍了关于mysql索引失效的常见九种原因的相关资料,需要的朋友可以参考下
    2022-06-06
  • MySQL数据表字段内容的批量修改、清空、复制等更新命令

    MySQL数据表字段内容的批量修改、清空、复制等更新命令

    MySQL数据表字段内容的批量修改、清空、复制等更新命令,需要的朋友可以参考下。
    2011-08-08
  • MySQL之索引结构解读

    MySQL之索引结构解读

    这篇文章主要介绍了MySQL之索引结构解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论