- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章一文搞清楚MySQL count(*)、count(1)、count(col)区别由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在工作中遇到count(*)、count(1)、count(col) ,可能会让你分不清楚,都是计数,干嘛这么搞这么多东西.
COUNT(expression):返回查询的记录总数,expression 参数是一个字段或者 * 号.
MySQL版本:5.7.29 。
创建一张用户表,并插入一百万条数据,其中gender字段有五十万行是为null值的 。
CREATE TABLE `users` ( `Id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT "id", `name` varchar(32) DEFAULT NULL COMMENT "名称", `gender` varchar(20) DEFAULT NULL COMMENT "性别", `create_date` datetime DEFAULT NULL COMMENT "创建时间", PRIMARY KEY (`Id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT="用户表";
在 MySQL 5.7.18 之前,通过扫描聚集索引来InnoDB处理 语句。SELECT COUNT( *)从 MySQL 5.7.18 开始, 通过遍历最小的可用二级索引来InnoDB处理SELECT COUNT( *)语句,除非索引或优化器提示指示优化器使用不同的索引。如果二级索引不存在,则扫描聚集索引。 大概意思就是有二级索引的情况下就使用二级索引,如果有多个二级索引优先选择最小的那个二级索引来降低成本,没有二级索引使用聚集索引.
下面通过测试来验证这些观点.
首先,在只有Id这一个主键索引的情况下查询执行计划, 。
可以看到,type是index也就是使用了索引,key是PRIMARY就是使用了主键索引,key_len=8.
其次在name字段上加上索引,再次使用执行计划查看 。
可以看到同样使用了索引,只不过索引用的是name字段的索引,key_len=99.
然后在保留name字段索引的情况下给create_date字段也加上索引,再次查看执行计划 。
可以看到这次使用的是create_date字段的索引了,key_len=6.
不管上述是使用了哪个索引,其最后查询到的总行数都是一百万条,无论它们是否包含 NULL值.
count(1) 和count(*) 执行查询结果一样,最终也是返回一百万条数据,无论它们是否包含 NULL值.
count(col) 统计某一列的值,又分为三种情况:
和count(*) 执行查询结果也是一样,最终也是返回一百万条数据. 。
以count(name)进行查询,执行计划如下:
可以看到用的是索引字段进行统计,索引也命中了。 把一列中的name字段置为NULL,再进行count查询,结果返回999999 。
再把这列的NULL值置为空字符串,再进行count查询,结果返回1000000 。
所以,综上简单的使用索引字段统计行数能够命中索引,并且只统计不为NULL值的行数.
统计不带索引的字段的话就不会使用索引,而且也是只统计不为NULL值的行数.
之前也不知道在哪看到的或听说的,count(1) 比count(*) 效率高,这是错误的认知,官网上有这么一句话,InnoDB handles SELECT COUNT( *) and SELECT COUNT(1) operations in the same way. There is no performance difference. 翻译过来就是,InnoDB以同样的方式处理SELECT COUNT( *)和SELECT COUNT(1) 操作,没有性能差异.
对于MyISAM表, 如果从一个表中检索,没有检索到其他列并且没有 子句,COUNT(*)则优化为非常快速地返回 ,此优化仅适用于MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问。 COUNT(1)仅当第一列定义为 时才进行相同的优化NOT NULL。----来自MySQL官网 这些优化都是建立在没有where 和 group by的前提下的.
阿里开发规范中也提到 。
所以在开发中能用count(*) 就用count( *). 。
count(*)、count(1)、count(id):返回查询的记录总数,无论字段是否包含空值,且count( )和count(1)效率是一样的,没差别,通过上面的执行计划可以推断count(id) 和count()、count(1) 效率应该也是一样的或者说是很接近,有兴趣的可以测试一下。 对统计带非主键索引和不带索引的字段进行统计的时候都是统计不为NULL的行数.
到此这篇关于一文搞清楚MySQL count(*)、count(1)、count(col)区别 的文章就介绍到这了,更多相关MySQL count(*),count(1),count(col)内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文地址:https://blog.csdn.net/qq_39654841/article/details/122787038 。
最后此篇关于一文搞清楚MySQL count(*)、count(1)、count(col)区别的文章就讲到这里了,如果你想了解更多关于一文搞清楚MySQL count(*)、count(1)、count(col)区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个照片库的标准循环,我正在使用 twitter-bootstrap col-xs-12 col-sm-6 col-md-4 col-lg-3 这让我在桌面上看到 4 张图片,在移动设备上缩小到单
我有一个关于 bootstrap 3.0 类顺序的问题,现在如果我在从 sm 到 lg 的地方写下以下内容:- 如果我将类(class)顺序从 lg 更改为 sm,会有什么不同吗:- 或者顺序无关
如果类中没有指定col-lg和col-md,那么col-sm是否适用于所有大屏? 最佳答案 是的。 来自 bootstrap , Grid classes apply to devices with
我有一个概念,希望你能帮助澄清: 以下三种引用 PySpark 数据框中列的方式有什么区别。我知道不同的情况需要不同的形式,但不知道为什么。 df.col :例如F.count(df.col) df[
我们的代码是用C写的,DB是Informix。我们正在对 ESQL 程序进行一些代码优化,发现以下查询: UPDATE [TABLE] SET [PRIMARY KEY COLUMN] = [NEW
我的网站需要 3*3 的响应式服务框。但对齐方式不正确。第一行中的每个框在第二行中都不同,最后一个框正在移动到第四行。因此需要 3*3 框类型的代码。
我们发现这些查询之间存在巨大差异。 查询速度慢 SELECT MIN(col) AS Firstdate, MAX(col) AS Lastdate FROM table WHERE status =
如何在 gnuplot 中执行此操作: plot "test.csv" using 1:2 if value_in_column_3 == 80.0 它应该只选择第 3 列 == 80.0 的行并忽略
不确定从哪里开始 - 不确定问题是我在愚弄查询优化器,还是涉及空值时索引工作方式的固有问题。 我遵循的一个编码惯例是像这样编写存储过程: declare procedure SomeProc @I
两者之间有什么区别吗: CONCAT_WS('', 列)='' 和 列为空或列=0 *(以及可选的“OR column="”')* 其中一个更好/更快吗......? SELECT my_fields
我有一个像这样的数据框: ColA ColB ColC "lorem ipsum" ["lorem", "foo"
我在编写查询时遇到问题。假设我有一个包含汽车制造商和型号的表格,但我想删除所有与型号列表无关的行,我已经写了这个... DELETE FROM `cars` WHERE `make` != 'Ford
而不是使用 我可以这样做吗, ? 即MyCOLUMS = col-xs-1 col-sm-2 col-md-3 col-lg-4 . 如果可能,请解释如何实现?如果此方法错误,请解释错误原因。 最佳答
我必须在机器学习之前做一些数据清理,我的数据框如下所示: +-------+--------+---------+--------+-------+| userid|artistid|playcoun
在我的左边col我有一个 在我的右边col我有一些文字。我要左边col与右侧高度相同col .然后我想要 填补左边col .看起来很简单,但我做不到。这是我当前的代码:
我很好奇替换是否正确 ... ... 与 ... ... 用javascript? 我所需要的只是隐藏第二个 div 并正确地通过 javascript 显示第一个 div 的 100%。实际完成的操
我尝试了很多不同的解决方案:将类中心 block 添加到“行”,将“行”包装在 .我只想有 4 个 imges,居中,但它们被移到了左边。请帮助我,我的错误是什么?谢谢。
假设我有 COUNTRY |邮政编码 列。会有很多重复项,但大多数情况下,一些 COUNTRY 值将丢失,而 POSTAL CODE 将出现。如何在 POSTAL CODE 匹配的其他行中用 COUN
Twitter Bootstrap 中的 col-lg-* 、col-md-* 和 col-sm-* 有什么区别? 最佳答案 2020 年更新... Bootstrap 5 在 Bootstrap 5
问题:IE8 仅考虑我的带有 col-x 类的网格布局。我发现了一个相关/类似的问题IE8 issue with Twitter Bootstrap 3 wrt Respond.js 和 htm5sh
我是一名优秀的程序员,十分优秀!