MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取

MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取

大家好,又见面了,我是全栈君。

阿里云CloudDBA具有SQL优化建议功能,包括SQL重写建议和索引建议。SQL索引建议是帮助数据库优化器创造最佳执行路径,需要遵循数据库优化器的一系列规则来实现。CloudDBA需要首先计算表统计信息,是因为:

  • 数据库优化器通常是基于代价寻找执行路径;
  • SQL优化建议所针对的数据库不限于MySQL数据库,也不局限于某一个特定版本;

1. 基本原则

数据库统计信息在SQL优化起到重要作用。用来估算查询条件选择度的常见统计信息包括表统计信息和字段统计信息。DBA计算查询条件选择度或代价时经常通过手工执行SQL语句获取,并进行返回行数或代价的粗略估算。

  • 表统计信息:表中总记录数;
  • 字段统计信息:包括最大值,最小值;以及不同值个数;

而要相对更准确的获取条件选择度的估算,往往需要统计直方图(Histogram),因为多数情况,每个值的出现频度是不一样的。针对复杂SQL的优化,比如多条件查询、Range查询以及多表关联查询等,统计直方图能帮助DBA更好的进行代价估算。

在云上环境,获取统计信息以最小代价为前提的,不能对生产系统造成任何性能上的负面影响,也不能耗费较长时间。获取统计数据的基本原则如下:

  • 从备库获取统计数据;
  • 只统计最近数据;
  • 采取抽样的方式获取数据;
  • 不抽取原始数据,只对数据的hash值进行统计;

2. 最近数据统计

长期变化的数据通常具有周期性,并且以天为基本周期符合一般业务逻辑。因此多数情况无需对全量数据进行统计,抽取最近一天的数据通常具有代表性。

3. 样例数据统计

云上数据库通常要求表设计中有自增主键。在这一条件下获取表的最近数据的方法较为简单,比如:

	select * from tab order by id desc limit 1000;

该语句通过在自增主键上做排序并获取最近插入的1000行数据。由于id是主键,排序并无额外代价。类似方式可以获取第其它样例数据,比如:

	select * from tab order by id desc limit 10000, 1000;

4. 数据特征分析

基于抽样数据,对影响选择度或查询返回行数的特性进行分析:

  • 数据频率

    对每一份样例数据中不同字段的频率统计之后,需要推导出或预测字段中的某个数值在全表中的频率情况。通过分析不同样例数据间的数据重合度在具体实践中具有实际意义。

  • 数据密度

    获取每个字段的最大值和最小值代价较高。变通方法就是通过样例数据的最大最小值以及频率进行数据密度计算。基于数据密度数据,估算范围查询返回行数。

  • 字段关联性

    评估多条件查询的选择度需要首先获取字段之间的关联性。若多条件查询条件关联性很低,则综合选择度就是单个条件选择度的乘积;若多条件查询条件关联性较高,则采用最小选择度(或乘以系数)作为综合选择度。

5. 总结

  • 直方图是对基本数据的估计,任何直方图都不是精确的;
  • 云上环境以最小代价获取统计数据是基本前提;
  • 数据库优化器需要选择的是最佳路径,得出字段之间选择度的相对值更为重要;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108093.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【Spring Boot】使用Spring Boot来搭建Java web项目以及开发过程

    一、SpringBoot简介SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapidapplicationdevelopment)成为领导者。SpringMVC是非常伟大的框架,开源…

  • C语言实现-航空订票系统(飞机订票系统)单机版&联网版「建议收藏」

    C语言实现-航空订票系统(飞机订票系统)单机版&联网版「建议收藏」操作系统:Windows下运行。如果需要在Linux运行,则需要修改删除conio.h,自己写个头文件获取键盘输入。我已经写好了getch.h文件,需要将其导入使用。开发环境:CodeBlocks开发语言:C实现功能:登录,订票,退票数据存储:文本读写涉及文件:相关文件下载:码云:传送门GitHub:传送门相关图片(仅供参考):程序是没有涉及旅行社的ER…

  • git比较两个版本之间的区别

    git比较两个版本之间的区别

    2021年10月24日
  • CSS3选择器01—CSS2.1部分选择器[通俗易懂]

    这篇文章主要用于存储CSS以及CSS3的选择器部分知识,以便日后查阅及记忆.该内容分为两部分,第一部分为css选择器的一些基本知识。第二部分为CSS3新增加的选择器。在开始之前,先简单介绍一下选择

  • BigDecimal除法问题

    BigDecimal除法问题BigDecimal做除法时,尽量使用divide(BigDecimaldivisor,intscale,introundingMode),这个方法divisor:被除数  scale保留小数位数  roundingMode保留小数时采用的方法,一般使用BigDecimal.ROUND_UP(四舍五入)如果不指定保留小数位数,在遇到除不尽的情况下就会报错BigDecimal源码:…

  • React图片懒加载

    React图片懒加载话不多说了,创建一个LazyLoad.js的React组件,然后将下面的代码复制过去:importReactfrom’react’//import’./lazyload.css’//thresholdconstthreshold=[0.01]classLazyLoadextendsReact.Component{construc…

发表回复

您的电子邮箱地址不会被公开。

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