您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 执行开销 >

MySQL80 · 优化器新特性 · Cost Model 直方图及优化器开销

发布时间:2019-06-28 08:46 来源:未知 编辑:admin

  MySQL当前已经发布到MySQL8.0版本,在新的版本中,可以看到MySQL之前被人诟病的优化器部分做了很多的改动,由于笔者之前的工作环境是5.6,最近切换到最新的8.0版本,本文涵盖了一些本人感兴趣的和优化器相关的部分,主要包括MySQL5.7的cost model以及MySQL8.0的直方图功能。

  MySQL当前已经发布到MySQL8.0版本,在新的版本中,可以看到MySQL之前被人诟病的优化器部分做了很多的改动,由于笔者之前的工作环境是5.6,最近切换到最新的8.0版本,本文涵盖了一些本人感兴趣的和优化器相关的部分,主要包括MySQL5.7的cost model以及MySQL8.0的直方图功能。

  为什么需要配置cost model常量 ? 我们知道MySQL已经发展了好几十年的历史,但是在优化器中依然使用了hardcode的权重值来衡量io, cpu等资源情况,而这些权重值实际上是基于多年前甚至十来年前的经验设定的。想想看,这么多年硬件的发展多么迅速。几十上百个核心的服务器不在少数甚至在某些大型公司大规模使用,ssd早就成为主流,NVME也在崛起。高速RDMA网络正在走入寻常百姓家。这一切甚至影响到数据库系统的实现和变革。显而易见,那些hardcode的权值已经过时了,我们需要提供给用户可定义的方式,甚至更进一步的,能够智能的根据硬件环境自动设定。

  MySQL5.7引入两个新的系统表, 通过这两个系统表暴露给用户来进行更新,如下:

  可以看到用法也非常简单,上面包含了两张表:server_cost及engine_cost,分别对server层和引擎层进行配置

  全局cache维护了一个当前的cost model信息, 用户线程在lex_start时会去判断其有没有初始化本地指针,如果没有的话就去该cache中将指针拷贝到本地

  由于用户可以动态的更新系统表,执行完flush optimizer_costs后,有可能老的版本还在被某些session使用,因此需要引用计数,老的版本ref counter被降为0后才能被释放

  统一的对象类型cost_estimate来存储计算的cost结果,包含四个维度:

  目前来看,除非根据工作负载,经过充分的测试才能得出合理的配置值,但如何配置,什么是合理的值,个人认为应该是可以自动调整配置的。关键是找出配置和硬件条件的对应关系。 这也是我们未来可以努力的一个方向。

  直方图也是MySQL一个万众期待的功能了,这个功能实际上在其他数据库产品中是很常见的,可以很好的指导优化器选择执行路径。利用直方图存储了指定列的数据分布。MariaDB从很早的10.0.2版本支持这个功能, 而MySQL在最新的8.0版本中也开始支持

  从输出的json可以看到,在执行了上述语句后产生的直方图,有4个bucket,数据类型为Int, 类型为equi-height,即等高直方图(另外一种是等宽直方图,即SINGLETON)。每个Bucket中,描述的信息包括:数值的上界和下界, 频率以及不同值的个数。通过这些信息可以获得比较精确的数据分布情况,从而优化器来根据这些统计信息决定更优的执行计划。

  如果列上存在大量的重复值,那么MySQL也可能选择等宽直方图,例如上例,我们将列k上的值更新为一半10一半为20, 那么出来的直方图数据如下:

  如上,对于SINGLETON类型,每个bucket只包含两个值:列值,及对应的累计频率(即百分之多少的数据比当前Bucket里的值要小或相等)

  注意这里的sampling-rate, 这里的值为1,表示读取了表上所有的数据来进行统计,但通常对于大表而言,我们可能不希望读太多的数据,因为可能产生过度的内存消耗,因此MySQL还提供了一个参数histogram_generation_max_mem_size来限制内存的使用上限。

  如果表上的DML不多,那直方图基本是稳定的,但频繁写入的话,那我们就可能需要去定期更新直方图,MySQL本身不会去主动更新。

  优化器通过histogram来计算列的过滤性,大多数的谓词都可以使用到。具体参阅官方文档

  通过直方图,我们可以根据列上的条件判断出列值的过滤性,来辅助选择更优的执行计划。在没有直方图之前我们需要通过在列上建立索引来获得相对精确的列值分布。但我们知道索引是有很大的维护开销的,而直方图则可以灵活的按需创建。

  MySQL通过rec_per_key 接口来估算记录的个数(暗示每个索引Key对应的记录个数),但在早前版本中这个数字是整数,对于小数会取整,不能表示准确的rec_per_key,从而影响到索引的选择,因此在5.7版本中,将其记录的值改成了float类型

  在之前的版本中,优化器是无法知道数据的状态,是否是cache在内存中,还是需要从磁盘读出来的,缺乏这部分信息,导致优化器统一认为数据属于磁盘的来计算开销。这可能导致低效的执行计划。

  server层新增api,用于获取表或索引上有百分之多少的数据是存储在cache中的

  基本的实现思路是:hash是一个定长的数组,数组元素为(key, val), 根据Key计算一个hash值再模上array size, 找到对应的槽位, 如果槽位被占用了,则向右查找一个空闲的slot。

  当数组满了的时候,会创建一个新的更大的数组,在数据还没Move到这个新hash之前,所有的search都需要查询两个数组。当所有的记录到迁移到新数组,并且没有线程访问老的数组时,就可以把老的hash删除掉了。

  在hash中存储的counter本身,也考虑到多核和numa架构,避免同时更新引起的cpu cache失效。在大量core的场景下这个问题可能很明显。Innodb封装计数操作到类ut_lock_free_cnt_t中,使用数组维护counter, 按照cpu no作为index更新,需要获取counter值时则累加数组中的值。

  这个Lock free hash并不是个通用场景的hash结构:例如处理冲突的时候,可能占用其他key的槽位,hash不够用时,需要迁移到新的array中。实际上mysql本身实现了一个lf_hash,在扩展Hash时无需迁移数据,有空单独开篇博客讲一下。

  当定义好接口,并且Innodb提供相应的统计数据后,优化器就可以利用这些信息来计算开销:

  查询优化器是指生成查询计划的子系统,该子系统通常完全处于服务器端,根据要参与连接(join)的表、数据读取方式(所殷读取或表扫描)和索引选择等因素制定查询计划。以基于开销的优化器为例,数据库查询优化器...博文来自:Wake_me_Up123的博客

  本篇文章主要是讲下查询的局限性java高级教程–安全博文来自:shareing

  说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT*、不使用NULL字段、合理创建索引、为字段选择合适的数据类型.....你是否真的理解这些优化技巧?是否理解它背后的工作原理?...博文来自:冷夜轩的博客

  MySQL5.6提供了对SQL的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A执行计划而不是选择B执行计划,帮助我们更好地理解优化器行为。  使用方式:首先打开trace,设置格...博文来自:taojin12的博客

  MySQL当前已经发布到MySQL8.0版本,在新的版本中,可以看到MySQL之前被人诟病的优化器部分做了很多的改动,由于笔者之前的工作环境是5.6,最近切换到最新的8.0版本,本文涵盖了一些本人感兴...博文来自:weixin_34390105的博客

  《SQL优化器最佳实践》——韩锋著本文大部分内容取自韩锋《SQL优化器最佳实践》,文章用于记录本人学习过程,非商用使用。第2章优化器与成本话题一、【优化器】什么是优化器?优化器的作用是什么?优化器是数...博文来自:指尖的回忆

  本文的目的:1、说一说Oracle的Optimizer及其相关的一些知识。2、回答一下为什么有时一个表的某个字段明明有索引,当观察一些SQL的执行计划时,发现确不走索引的问题。3、如果你对FIRST_...博文来自:unixboy

  MySQL的万能quot;嵌套循环quot;并不是对每种查询都是最优的。不过还好,MySQL只对少部分查询不使用,我们往往可以通过改写查询来让MySQL高效地完成工作。MySQL5...博文来自:加油

  MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。最终目标是提交SELECT语句查找数据行,而不是排除数据行。优化器试图排除数据行的原...博文来自:宇弦

  一些简洁实用的做法:基础内容1.建立索引   优化建议:常用查询字段建立索引以及联合索引 (最左优先原则)2.避免模糊条件,例如null值判断,!=、lt;gt;、or、in、no...博文来自:这里应该有一个很正经的标题的。!。!。!。!夏天来了

  了解一些优化器的知识,作为对如何建立索引的补充,对我们是有好处的,因为这样你才能更好地利用自己所建立的索引。某些编写查询的方法实际上让索引不起作用,在一般情况下你应该避免这种情形的发生。这一讲中将讨论...博文

  Mysql查询优化器浅析(上)译者:杨万富 1定义   Mysql查询优化器的工作是为查询语句选择合适的执行路径。查询优化器的代码一般是经常变动的,这和存储引擎不太一样。因此,需要理解最新版本的查询...博文来自:ywf的专栏

  Oracle有两种优化器:RBO和CBO。RBO的最大的问题在于它是靠硬编码在ORACLE数据库代码中的一系列规定的规则来决定目标SQL的执行计划的,而并没有考虑目标SQL中所涉及的对象的时间数据量,...博文来自:Watson的专栏

  Oracle12C优化器的巨大变化,上生产必读(上)序言 优化器是Oracle数据库最吸引人的部件之一,因为它对每一个SQL语句的处理都必不可少。优化器为每个SQL语句确定最有效的执行计划,这是基于给...博文来自:u011118289的专栏

  GradientDescent(BatchGradientDescent,BGD)梯度下降法是最原始,也是最基础的算法。它将所有的数据集都载入,计算它们所有的梯度,然后执行决策。(即沿着梯度相反的方向...博文来自:Aliz_

  执行计划是数据库根据sql语句和相关表的统计信息得出的一个查询方案。这个计划是数据库查询优化器自动生成的。要生成一个正确的执行计划,需要注意两点:SQL语句是否正确的告诉了查询优化器它想干嘛。查询优化...博文来自:Damon__Wang的博客

  手册上MYSQL查询优化器概述;个人对MySQL优化器的理解;分析优化器优化过程中的信息;调节MySQL优化器的优化等...博文来自:hsd2012的专栏

  在日常应用中,基本都是读多写少。针对已经写好的sql语句。可以启动慢查询来看查询时间。  在查询sql的优化中,可以使用explainextended来看sql的运行效果。explian是将 ...博文来自:Damon__Wang的博客

  工作需要,最近要调整数据库,性能上做一些优化,对于我这个新手来说,数据库调优?都需要优化什么,哪些东西会影响到数据...博文来自:测试蜗牛,一步一个脚印

  MySql深化学习1 explain用法explain可以帮助我们分析select语句,找出select语句的瓶颈,从而可以针对性地去做优化,让MySQL查询优化器更好地工作。MySQL查询优化器有几...博文来自:coder的博客

  反正是要学一些API的,不如直接从例子里面学习怎么使用API,这样同时可以复习一下一些基本的机器学习知识。但是一开始开始和以前一样,先直接讲类和常用函数用法,然后举例子。 这里主要是各种优化器,以及使...博文来自:人工智能安全机器人手术机器人

  from: 基于随机梯度下降(SGD)的优化算法在科研和工程的很多领域里都是极其核心的。很多理论或工程问题都可以转化为对目...博文来自:caiexu的博客

  因为大多数机器学习任务就是最小化损失,在损失定义的情况下,后面的工作就交给了优化器。因为深度学习常见的是对于梯度的优化,也就是说,优化器最后其实就是各种对于梯度下降算法的优化。常用的optimizer...博文来自:呆呆的猫的博客

  在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是Adam,为什么呢?下面是TensorFlow中的优化器,博文来自:tiankongtiankong01的博客

  MySQL采用基于开销的优化器(CBO),以确定处理查询的最解方式,也就是说执行查询之前,都会先选择一条自以为最优的方案,然后执行这个方案来获取结果。MySQL优化器中,一个主要的目标是只要可能就是用...博文来自:Mark Down Here

  MySQL服务器逻辑架构第一层,客户端/服务器。负责连接,授权,安全等。每个客户端连接都会在服务器拥有一个线程。解析器解析查询并创建解析树,然后优化(重写查询,选择索引等)节奏执行,select语句在...博文来自:不想逆天

  在“查询优化器常用的方式”一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MYSQL版本的升级而得到改善,所以本文会列出一些常见的局限性,...博文来自:andyzhaojianhui的专栏

  在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是Adam,为什么呢?下面是TensorFlow中的优化器,博文来自:junchengberry的博客

  Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在...博文来自:雨花石

  Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在...博文来自:ocean1010的专栏

  Mysql查询优化器本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率。那么到底mysql到底能...博文来自:caomiao2006的专栏

  子查询优化MySQL支持子查询的优化,把子查询细分为两种情况:特殊类型的子查询(如ALL/ANY等,可用索引进行MAX/MIN转换优化)、普通类型的子查询(用上拉操作优化)。对于普通类型的子查询,My...博文来自:那海蓝蓝的博客

  sql优化器会重写sql  sql在执行时,并不一定就会按照我们写的顺序执行,mysql优化器会重写sql,如何才能看到sql优化器重写后的sql呢?这就要用到explainextended和show...博文来自:wangjun5159的专栏

  caffe中solver不同优化器的一些使用方法(只记录一些常用的)下面是一些公用的参数测试时需要前向传播的次数,比如你有1000个数据,批处理大小为10,那么这个值就应该是100,这样才能够将所有的...博文来自:葫芦与瓢的博客

  优化器总结机器学习中,有很多优化方法来试图寻找模型的最优解。比如神经网络中可以采取最基本的梯度下降法。梯度下降法(GradientDescent)梯度下降法是最基本的一类优化器,目前主要分为三种梯度下...博文来自:SanFancsgo的博客

  github博客传送门博客园传送门计算出损失值后,这个损失值越小越好,梯度下降的算法就用在这里,帮助寻找最小的那个损失值,从而反推出w和b达到优化模型的效果常用的梯度下降法可以分为:批量梯度下降:遍历...博文来自:Mrzhang

  在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是Adam,为什么呢?下面是TensorFlow中的优化器,博文来自:学眞的博客

  1.配置bin到path2.mysql解压版本在根目录创建3.初始化数据库:mysqld--initialize--console,这里会生成一个初始密码,需要记录下来,否则需要删除dat...博文来自:赣江

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:杨威的博客

  本帖只谈技术实现,首先我们自己来编译一个比特币客户端吧, 技术讨论,欢迎大家入伙(注明:csdn)。...博文来自:开心乐源的专栏

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer...博文来自:kongwei521的专栏

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  mybatis简单小巧易于上手,方便浏览修改sql语句博文来自:努力+坚持,而且还很年轻

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。   在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 (...博文来自:朱小厮的博客

  我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行。/** * 图片工具类 * @author 水寒 * 欢迎访问水寒的个人博客:...博文来自:水寒

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  1. 规则引擎面临的问题:业务规则的实现大部分是由开发人员来实现的 业务规则需要业务分析人员能够阅读和理解 业务规则的可读性和用户的友好性都不太好2. DSL领域特殊语言DSL == Domain...博文来自:哎幽的成长

  nginx 是个轻量级的Web服务器,比Apache不差博文来自:老徐2014

  若是研究区在中国,则在地理空间数据云有中国区合成好的数据,直接下载用即可。数据格式为TIF。坐标为WGS84,不用再转换投影。下载网址为:博文来自:hengcall的博客

  :《代码整洁之道:程序员的职业素养》这本书提到过所谓的“心流状态下”,这种状态只是错觉而已,并不能提高你的代码质量

  zhenghaoquan:nacos server本机跑了一下,啥服务都没注册,刚开始还好,两个小时后cpu百分百。。。。重启后试了几次,该现象能够稳定重现。。。看来稳定性还是够呛啊。。。。

  spermly:马云麾下很多人才,他的财产提高了540倍,您的文章中的新技术可以看出马云走向,应该是会更加辉煌

http://nicolashsiung.com/zhixingkaixiao/137.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有