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)

相关推荐

  • Hibernate中提示serverTimezone出现问题怎么办

    技术Hibernate中提示serverTimezone出现问题怎么办小编给大家分享一下Hibernate中提示serverTimezone出现问题怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望

    攻略 2021年12月8日
  • position:sticky该如何使用

    技术position:sticky该如何使用这期内容当中小编将会给大家带来有关position:sticky该如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  在研究rem布局

    攻略 2021年11月16日
  • python模块shutil函数怎么用

    技术python模块shutil函数怎么用小编给大家分享一下python模块shutil函数怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!本文大纲os模块是Python标准库中一个重要的模块,里面

    攻略 2021年10月27日
  • 第一条铁路,中国第一条铁路建设几年

    技术第一条铁路,中国第一条铁路建设几年中国第一条小铁路——1865年,英国商人杜兰德在北京宣武门外沿着护城河修建了一条一里长“展览铁路”德小铁路,这是中国出现最早的一条铁路第一条铁路。不久,清统治者以:“观者骇怪”为由,

    生活 2021年10月19日
  • Golang中配置信息处理框架Viper有什么用

    技术Golang中配置信息处理框架Viper有什么用这篇文章主要介绍Golang中配置信息处理框架Viper有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Viper项目地址:https:/

    攻略 2021年11月18日
  • Reflect反射

    技术Reflect反射 Reflect反射es6提供了一个全新的api----Reflect,其将object对象一些内部的方法,放到Reflect对象上,将来可能彻底取代Object对象内部的这些方法

    礼包 2021年12月21日