水平有限如有误请指出
源码版本:5.7.22
欢迎关注我的《深入理解MySQL主从原理 32讲 》,如下:
如果图片不能显示可查看下面链接:
继上一篇文章:
https://www.jianshu.com/p/ce063e2024ad MySQL:查询字段数量多少对查询效率的影响我们继续来讨论一下count(*) count(字段) 实现上的区别。注意我们这里都使用Innodb做为存储引擎,不讨论其他引擎。因为了有了前面的讨论,更容易看出它们的区别,这里我们有如下注意点:本文还是使用简单的全表扫描来进行对比实现上的区别。首先我们要明确的是count使用的是一个COUNT计数器。在示例中我们也可以看到两个语句的结果实际上并不一致这种不一致来自于b=’g’的c列中 都是NULL值,因此count(c)返回为0。注意在《MySQL:查询字段数量多少对查询效率的影响》一文中我们已经详细的描述了部分流程,这里不再熬述,如果需要更加详细的了解,自行参考。1、MySQL层 构建read_set 这里构建的read_set实际上只会包含列b,即一个字段。2、Innodb层 构建模板同理根据read_set构建的字段模板中只会包含列b。3、Innodb层 根据模板返回数据这里我们可以看看模板的数量和模板对应的具体列名显然这里只是将b列的值返回给了MySQL层,这里也很好理解,因开发云主机域名为b列在MySQL层需要继续做过滤操作。4、MySQL层 过滤条件b=’g’好了当前返回给MySQL层的数据中只有b列的数据,然后施加b=’g’这个条件进行过滤。5、MySQL层 过滤后做一个COUNT计数操作对于普通的select语句过滤后的数据就可以返回了,但是对于count这种操作,这里做的是一个计数操作,其中行会对count 字段的NULL值进行判断,当然这里是count(*) 也就不存在NULL值判断了,下面是这段代码:最终我们只需要返回这个计数就可以了。下面是发送的数据,断点可以设置在Query_result_send::send_data中。我们可以发送的数据实际就是这个计数器,最终值为3。实际上整个流程基本一致,但是区别在于:最终会调入函数Field::is_null进行NULL值判断,断点可以设置在这里。示例中的语句count(c)返回为0。现在我们很清楚了,这些数据什么时候过滤掉的,总结如下:而count(*)则没有第3步,这是一个不同。然后的不同点就是在返回的字段上:通过上面的分析,实际上
效率没有太大的差别,我觉得同样执行计划,同样返回数据结果的前提下,可能count(*)的效率要略微高一点。
mysql-外键父表:t_grade子表:t_student当在字表开发云主机域名中插入数据时,必须有与其对应的父表记录,若父表中无对应的相关记录,则子表的数据插入失败相关推荐: SQL数据库的安装SQL数据库的安装第一步 挂载SQL镜像文件第二步 打开SQL…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。