mysql的count语句(mysql中count函数)

技术MySQL中count(1)、count(*)、count(字段)的区别有哪些这篇文章主要为大家展示了“MySQL中count(1)、count(*)、count(字段)的区别有哪些”,内容简而易懂,条理清晰,希望能

本文主要给大家展示“MySQL中count(1)、count(*)和count (field)有什么区别”,简单易懂,组织清晰,希望能帮你解决疑惑。让边肖带领大家学习《MySQL中count(1)、count(*)和count (field)有什么区别》一文。

关于数据库行数的统计,无论是MySQL还是Oracle,都有一个可以使用的函数,那就是COUNT。

但是,就是这个常用的COUNT函数,却隐藏着很多谜团,尤其是在面试的时候,如果不小心,就会被滥用。如果你不相信我,请试着回答以下问题:

1.COUNT怎么用?

2.COUNT(字段名)和COUNT(*)的查询结果有什么区别?

3.COUNT(1)和COUNT(*)有什么区别?

4.COUNT(1)和COUNT(*)之间哪个效率更高?

5.为什么建议《阿里巴巴Java开发手册》使用COUNT(*)

6.MySQL的MyISAM引擎对COUNT(*)做了哪些优化?

7.MySQL的InnoDB引擎对COUNT(*)做了哪些优化?

8.MySQL优化上面提到的COUNT(*)的关键前提是什么?

9.选择count (*)时,有无where条件有什么区别吗?

10.COUNT(*)、COUNT(1)、COUNT(字段名)的执行过程是怎样的?

如果以上10个问题都能正确回答,那么你就真的知道COUNT函数了。

00-1010 1,COUNT(expr),返回由SELECT语句检索的行数,该语句的expr值不为空。结果是一个BIGINT值。

2.如果查询结果没有找到任何记录,则返回0。

3.但是,值得注意的是,COUNT(*)的统计结果将包含空值的行数。

除了COUNT(id)和COUNT(*),还可以使用COUNT(常量)(如COUNT(1))来计算行数。这三种SQL语句有什么区别?哪个效率更高?为什么《阿里巴巴Java开发手册》中强制不使用COUNT(列名)或COUNT(常量)来代替COUNT(*)?

1.初识COUNT

COUNT(常量)和COUNT(*)表示数据库表中可以直接查询的行数。

COUNT(列空)表示满足查询条件的列值为非空的行数。

COUNT(*)是对SQL92定义的行进行计数的标准语法。因为是标准语法,MySQL数据库优化了很多。

SQL92是数据库的ANSI/ISO标准。它定义了一种语言(SQL)和数据库的行为(事务、隔离级别等)。).

2.COUNT(字段)、COUNT(常量)和COUNT(*)之间的区别

MySQL主要使用两个执行引擎:

InnoDB引擎

MyISAM引擎

MyISAM不支持事务;MyISAM中的锁是表级锁;InnoDB支持事务和行级锁。

3.COUNT(*)的优化

MyISAM做了一个简单的优化,分别记录了表中的总行数。如果执行count(*),只要没有where条件,就可以直接返回。MyISAM是表级锁,不会有并发的行操作,所以结果是准确的。

MyISAM

InnoDB不能使用这个缓存操作,因为它支持事务,大部分操作都是行级锁,可能会并行修改行,所以缓存记录不准确。

然而,InnoDB对COUNT(*)语句做了一些优化。

用低成本索引扫描表格,不关注表格的具体内容。

InnoDB中的索引分为聚集索引(主键索引)和非聚集索引(非主键索引)。聚集索引的叶节点保存整行记录,而非聚集索引的叶节点保存该行记录的主键的值。

MySQL将优先使用最小的非聚集索引来扫描表。

优化的前提是查询语句不包含where条件和group by条件。

InnoDB

MySQL官方文档这样说:

InnoDB以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作。性能没有差别。

所以,对于count(1)和count(*),MySQL优化完全一样,没有更快的了!

但是,仍然建议使用count(*),因为这是对SQL92定义的行进行计数的标准语法。

00-1010,扫描整个表确定指定字段的值是否为空,如果不为空则累加。

性能比计数(1)和计数(*)慢。

4.COUNT(*)和COUNT(1)

COUNT函数的用法主要用于统计行数。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。

因为COUNT(*)是SQL92定义的对行进行计数的标准语法,所以MySQL对其进行了大量优化。MyISAM会直接单独记录表中的总行数,以COUNT(*)进行查询,而InnoDB在扫描表时会选择最小的索引,以降低成本。当然,这些优化的前提是没有where和group的条件查询。

在InnoDB中COUNT(*)和COUNT(1)的实现没有区别,效率是一样的,但是COUNT(字段)需要对字段进行非null判断,所以效率NULL会更低。

因为COUNT(*)是SQL92定义的统计行数的标准语法,而且效率高,所以请直接使用COUNT(*)查询表中的行数!

以上就是《MySQL中count(1)、count(*)和count (field)有什么区别》一文的全部内容,感谢阅读!相信大家都有一定的了解,希望分享的内容对大家有所帮助。想了解更多知识,请关注行业资讯频道!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155608.html

(0)

相关推荐

  • xamarin开发常见错误总结--the operation was canceled

    技术xamarin开发常见错误总结--the operation was canceled xamarin开发常见错误总结--the operation was canceled1.1.1 操作被取消异

    礼包 2021年12月1日
  • 用好像写一句话,用好像……好像……好像造句

    技术用好像写一句话,用好像……好像……好像造句1、天空中的云变幻无穷,有的像小狗,好像在伏在地上打盹用好像写一句话;有的像野狼,好像在仰天长啸;有的像雄鹰,好像在展翅飞翔。2、花园里的花真是千姿百态:有的傲立在枝头,好像

    生活 2021年10月22日
  • Viper FTP怎么用

    技术Viper FTP怎么用今天就跟大家聊聊有关Viper FTP怎么用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Viper FTP是一款Mac平台上功能强大

    攻略 2021年11月20日
  • 如何使用Ranger给HDFS授权

    技术如何使用Ranger给HDFS授权这篇文章给大家介绍如何使用Ranger给HDFS授权,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。主要介绍如何使用Ranger 给HDFS 授权。文档概述1.介

    攻略 2021年11月2日
  • 如何搭建RISC-V编译环境与运行环境

    技术如何搭建RISC-V编译环境与运行环境如何搭建RISC-V编译环境与运行环境,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们现在芯片被

    攻略 2021年12月10日
  • C/C++指针知识点有哪些

    技术C/C++指针知识点有哪些本篇内容介绍了“C/C++指针知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基

    攻略 2021年11月30日