mysql explain不准确_mysql explain预估剖析「建议收藏」

mysql explain不准确_mysql explain预估剖析「建议收藏」引子:使用MySQL建立了一张表country,总共有才3121行记录。但是使用explainselectcount(*)fromcountry;的时候,发现行数rows达到6897,让我大吃一惊。mysql>explainselectcount(*)fromcountry;+—-+————-+———+——+————–…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

引子:

使用MySQL建立了一张表country,总共有才3121行记录。

但是使用explain select count(*) from country;的时候,发现行数rows达到6897,让我大吃一惊。

mysql> explain select count(*) fromcountry;+—-+————-+———+——+—————+——+———+——+——+——-+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+—-+————-+———+——+—————+——+———+——+——+——-+

| 1 | SIMPLE | country | ALL | NULL | NULL | NULL | NULL | 6897 | NULL |

+—-+————-+———+——+—————+——+———+——+——+——-+

问题:为什么explain的结果和真实的结果运行不一致,并且产生这么大的误差?

针对这个问题,上网查了些资料,特此发博文总结下,当然自己也是刚刚使用mysql,有很多不了解的地方,希望多多指正。

一、explain是什么?

通过explain可以查看MySQL的执行计划,从而知道MySQL是如何处理我们的SQL语句。具体来说通过explain我们能得到一系列的关键信息,比如哪些索引被实际使用,查询了多少行等等。

explain使用Rows来告知我们数据库即将要阅读的行数,但是实际将要阅读的行数和explain所记载的将要阅读的行数可能会有差异,这是因为explain并没有真的去执行sql语句从而得出行数,而是进行了某种预估。

二、explain怎么预估行数

1)mysql-5.5之前

首先找到查询第一个记录所在的page(记为PLeft),统计PLeft里的记录数(记为Records_PLeft),之后找到最后一个记录所在的page(记为PRight),统计PRight的记录数(Records_PRight),之后将Records_PLeft与Records_PRight取平均,最后乘以总共的page数目(记为Page_Num)。公式如下:

Rows = ((Records_PLeft + Records_PRight)/2)*Page_Num

统计上讲这个预估方法是很有偏的。比如总共4个page:page1(999 records), page2(1 record), page3(1 record), page4(1 record),这样预估出来的Rows=((999+1)/2)*4 = 2000,然而实际上才总共才有1002个记录。

2)mysql-5.5之后

上述预估偏差大的关键在于有偏,而有偏的关键在于采样的page数太少了,事实上只采样了边界2个,新算法的思路很简单,增加采样数目,比如采样10个page,这样可以在一定程度上降低偏差。

具体来说,mysql除了边界2个外,还沿着左侧page往右连续查找8个page,如果总的page数目小于等于10个,那么预估的Rows和真实的Rows一致。

Rows = ((Records_PLeft + Records_P1 + Records_P2 + … + Records_P8 + Records_PRight)/10)*Page_Num

上述方法只是在一定程度上缓解了有偏的问题,但是不准确还是存在的,事实上楼主的mysql版本是5.6版本,可见还是没有解决的很好。

三、思考

为什么是从左往右连续选8个page,而不是在首尾之间随机选择8个page,既然要缓解采样有偏的问题,那么随机选应该更好。猜想可能有两个原因:1)随机选择每次explain得到的Rows不一样,不方便应用;2)随机选会造成I/O开销,尤其是数据量大的时候,毕竟explain是希望能快速得到预估结果。

我觉得应该还有更好的算法,能实现explain效率与精度的tradeoff,希望大家能给出建议。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180883.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Jmeter性能测试(一)性能测试关键指标解析

    Jmeter性能测试(一)性能测试关键指标解析一、性能测试关键指标解析1、响应时间多–并发量快–延时、响应时间好–稳定性(长时间运行)省–资源利用率响应时间:对请求作出响应所需要的的时间,是用户感知软件性能的主要指标。响应时间包括:1.用户客户端呈现时间2.请求/响应数据网络传输时间3.应用服务器处理时间4.数据库系统处理时间响应时间多少合理?对于一个Web系统,普遍接受的响应时间标准为2/5/8秒(2秒–非常好;5秒–可接受;8秒是上限)2、并发用户数用户…

    2022年6月17日
    129
  • 【javaScript】cssText兼容及好处(相对于element.style)

    【javaScript】cssText兼容及好处(相对于element.style)cssText概念和特点cssText本质是什么?cssText的本质就是设置HTML元素的style属性值。cssText怎么用?document.getElementById(“d1”).style.cssText=“color:red;font-size:13px;”;cssText返回值是什么?在某些浏览器中(比如Chrome),你给他赋什么值,…

    2022年7月26日
    10
  • ssdp协议介绍_wsd协议

    ssdp协议介绍_wsd协议SSDP是一个“简单服务发现协议”,即英文“SimpleServiceDiscoveryProtocol的缩写”,该协议定义了如何在网络上发现网络服务的方法。SSDP也规定了存放在XML文件中的信息格式。SSDP信息的传送是依靠HTTPU和HTTPMU进行的。不论是控制点,或是UPnP设备,工作中都必然用到SSDP,设备接入网络之后,要利用它向网络广播自己的存在(广播的信息中还有设备位

    2022年10月11日
    0
  • SPPnet 笔记

    SPPnet 笔记ECCV2014的文章,后来又扩展成了TPAMI整体的先后次序:RCNN(CVPR2014)->SPPnet(ECCV2014)->FastRCNN(ICCV2015)->FasterRCNN(NIPS2015)现有的深度卷积网络需要固定大小的输入图片(比如224×224224\times224224×224),这个要求人工设计的痕迹过于明显,并且可能会降低一…

    2022年5月4日
    50
  • python,java,c语言哪个好_小萌新

    python,java,c语言哪个好_小萌新大学那会也被这个问题被困惑了大半年,直到毕业拿了几个大厂offer才发现语言的选择也就那一回事,我猜不少人刚入门的人依然被这个问题困扰着,所以决定认真分享一波我的经历。如果你还处于大一,大二,或者刚刚入门阶段,那么我认为,语言的选择并不重要,更重要的是底层/通用基础的学习,例如数据结构,算法,计算机网络这些,因为这些语言,是存在很多相同的特性的,例如你学习了C++,后面要转Java,那么其实还是可以很快就上手的。而且,等到了差不多毕业去应聘校招的时候,其实公司并不会对语言有严格的要求,例如你要面

    2022年10月22日
    1
  • pycharm database 没有_pycharm社区版使用教程

    pycharm database 没有_pycharm社区版使用教程网上教程都是直接打开右上角的database,但是我死活也没找到,后来发现应该是因为社区版的问题,需要自己安装,详细步骤如下图。1.打开File—》Settings—-》Plugins搜索database,选择DatabaseNavigator安装即可done~

    2022年8月29日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号