【mysql】count(*),count(1)与count(column)区别-程序员宅基地

技术标签: 【知识梳理】  

转自: https://www.cnblogs.com/CareySon/p/DifferenceBetweenCountStarAndCount1.html


    在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。

    往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。

    Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。

DECLARE @xx INT
SET @xx=NULL
 
SELECT COUNT(@xx) FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]

代码清单1.Count中指定NULL

 

     由于所有行都为NULL,则结果全不计数为0,结果如图1所示。

image

图1.显而易见,结果为0

 

    因此当你指定Count(*) 或者Count(1)或者无论Count(‘anything’)时结果都会一样,因为这些值都不为NULL,如图2所示。

image

图2.只要在Count中指定非NULL表达式,结果没有任何区别

 

 

那Count列呢?

    对于Count(列)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。

 

那Count(*)具体如何执行?

    前面提到Count( )有不为NULL的值时,在SQL Server中只需要找出具体表中不为NULL的行数即可,也就是所有行(如果一行值全为NULL则该行相当于不存在)。那么最简单的执行办法是找一列NOT NULL的列,如果该列有索引,则使用该索引,当然,为了性能,SQL Server会选择最窄的索引以减少IO。

    我们在Adventureworks2012示例数据库的[Person].[Address]表上删除所有的非聚集索引,在ModifyDate这个数据类型为DateTime的列上建立索引,我们看执行计划,如图3所示:

image

图3.使用了CreateDate的索引

 

    我们继续在StateProvinceID列上建立索引,该列为INT列,占4字节,相比之前8字节 DateTime类型的列更短,因此SQL Server选择了StateProvinceID索引。如图4所示。

image

图4.选择了更短的StateProvinceID索引

 

    因此,如果某个表上Count(*)用的比较多时,考虑在一个最短的列建立一个单列索引,会极大的提升性能。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tuntun1120/article/details/80707958

智能推荐

实习小白::(转) Cocos2d-x 3.x 开发(十八)10行代码看自动Batch,10行代码看自动剔除 --------其实就是渲染图片机制...-程序员宅基地

文章浏览阅读49次。1、概述 在游戏的运行过程中,图形的绘制是非常大的开销。对于良莠不齐的Android手机市场,绘制优化较好的游戏,可以在更多的手机上运行,因此也是优化的重 中之重。图形方面的优化主要体现在减少GPU的绘制次数上。这里我们分别从自动优化渲染批次和绘制剔除两个方面来看新版本在绘制上的优化。2、自动batch 在Cocos2d-x 3.x中,抛弃了先前手动...

Django3.0+Python3.8+MySQL8.0 个人博客搭建二十一|天坑合集_django3.0+python3.8+mysql8.0 个人博客搭建九|博客首页开发(一)-程序员宅基地

文章浏览阅读861次。文章目录一、makemigrations的坑二、`django-haystack`全文检索的坑1、`HAYSTACK`配置问题原因解决方法参考文章2、`six`模块找不到原因解决方法参考文章3、`python_2_unicode_compatible`在`django.utils.encoding`无法找到原因解决方法4、新增危险语法警告功能原因解决方法5、cryptography未安装原因解决方..._django3.0+python3.8+mysql8.0 个人博客搭建九|博客首页开发(一)

计算MD5值有几种方式_md5数值-程序员宅基地

文章浏览阅读7k次。想知道计算”hello“的MD5值有几种方式linux 命令行:[sm2env ~]# echo "hello" | md5sum | cut -d ' ' -f1 b1946ac92492d2347c6235b4d2611184说明:如果想获取字符串的其他哈希值,只要把命令中的md5sum 换成其他哈希命令就可以了。例如sha1sum,sha224sum,sha256sum,..._md5数值

Golang的Slice重要小知识Ⅱ_golang slice是引用传递吗-程序员宅基地

文章浏览阅读286次。关于切片作为函数参数进行传递的问题昨天,在做一道力扣题的时候,小编使用切片作为函数参数进行传递,并在函数中对切片进行修改,在小编印象里,切片属于引用类型,所以它传参数应该是引用传递,所以实参应该也是会有同样的变化,于是自信满满的提交了,可是结果出乎意料,并非小编所想的那样,那就让我们开启今天的话题,讨论讨论切片slice作为函数参数,是值传递还是引用传递?(感觉这完全可以是一道面试题!考验理论基础的时候到了!)一、值传递-指针传递-引用传递什么是值传递?值传递就是传递参数的时候,将实参拷贝一份作为形参_golang slice是引用传递吗

[HTML]去除li前面的小黑点,和ul、LI部分属性[转]_list-item 消除前面的点-程序员宅基地

文章浏览阅读1.1k次。对于很多人用div来做网站时,总会用到,但在显示效果时前面总是会有一个小黑点,这个令很多人头痛,但又找不到要源,其它我们可以用以下方法来清除。1、在CSS中写入代码。找到相关性的CSS,在。.li和.ul下写入list-sytle:none;当然有的会这样来写list-style-type:none, 这种写法特别是在一些CMS中最常见。2、在相关的页面找到head部分写入下面的代码_list-item 消除前面的点

反射获取储存的设备_android 反射获取mac-程序员宅基地

文章浏览阅读270次。//可以获取储存设备,包括U盘,此方法与adb通过storage获取的储存设备一致public List listAllStorage(Context context) { ArrayList storages = new ArrayList(); StorageManager storageManage_android 反射获取mac

随便推点

DeepSD论文笔记-程序员宅基地

文章浏览阅读563次。说明:1.此乃本人阅读论文过程中所记录的笔记,由于本人水平有限,难免会出现遗漏重点或表述不清等问题,请各位见谅。同时希望各位指出我的问题,让我发现问题所在,谢谢大家Thanks♪(・ω・)ノ。2.有些用词根据原文翻译(或是直接用原文),可能语句不通畅。(毕竟我是一个六级考了五次的憨憨)3.数据处理部分和结论分析部分没有加入,此处主要为了理清文章描述方法的处理流程。论文题目:3D Deep Shape Descriptor1.重要概念介绍   三维特征描述符(3D shape signat_deepsd

视频教程-IBM System 3650 M4服务器规划RAID安装win2008R2-Windows-程序员宅基地

文章浏览阅读806次。IBM System 3650 M4服务器规划RAID安装win2008R2 ..._3650m4重做raid

Vue3.0入门基础-程序员宅基地

文章浏览阅读395次,点赞2次,收藏6次。Vue3.0入门基础1. Vue3.0介绍1.1 为什么要学习 vue 31.2 Vue3带来的新变化1.3 破坏性语法更新2. Vue3开发环境搭建3. 组合式API3.1 composition vs options3.2 案例对比3.2.1 理解需求3.3 setup入口函数3.4 响应式系统API3.4.1 reactive 函数3.4.2 ref 函数3.4.3 toRefs 函数3.4.4 computed3.4.5 watch 侦听器3.5 生命周期函数3.6 父子通信3.7 provide_vue3.0入门

用友ERP-U8最新破解(再次更新版本,附安装过程中的解决办法)-程序员宅基地

文章浏览阅读8.5k次。新版用友u8.70下载地址:http://ftp.shangyuchem.com/应用软件/用友ERP-U8管理软件(8.70版).rar准备好安装环境,因为需要SQLSERVER和IIS支持,而个人的电脑又是VISTA basic版本的,处理起来比较麻烦,所以我先安装了(VirtualPC)虚拟机,在虚拟机上配置WIN2003+SP1+IIS6.0+SQLSERVER2000+补丁然后开始安..._u8绕过sps服务打补丁 csdn

2020 Android 大厂面试-插件化、模块化、组件化,移动开发工程师的岗位职责_android资源id是几进制-程序员宅基地

文章浏览阅读116次。替换了主工程context中LoadedApk的mResource对象将新的Resource添加到主工程ActivityThread的mResourceManager中,并且根据Android版本做了不同处理//第三步:关联resource和ActivityActivity activity = mBase.newActivity(plugin.getClassLoader(), targetClassName, intent);activity.setIntent(intent);//设置Act_android资源id是几进制

Windows内核基础之线程-程序员宅基地

文章浏览阅读793次。1. 线程结构体在0环,每个线程都有一个结构体ETHREAD。nt!_ETHREAD +0x000 Tcb : _KTHREAD +0x200 CreateTime : _LARGE_INTEGER +0x208 ExitTime : _LARGE_INTEGER +0x208 KeyedWaitChain : ...