SQL优化神器 SQLAdvisor

news2024/9/20 14:41:52

图片

简介

SQLAdvisor是一款开源的SQL优化工具,由美团点评公司的技术工程部DBA团队开发与维护。作为一个分析SQL语句并提出索引优化建议的工具,它基于MySQL原生词法解析,结合SQL中的where条件、字段选择度、聚合条件、多表Join关系等,输出最优的索引优化建议。

SQLAdvisor的使用与操作也相对简单直观。基本的命令行操作帮助可以通过--help参数获取。在实际操作中,使用者仅需将SQL语句作为输入传递给SQLAdvisor,即可接收到工具生成的索引优化建议。这些建议通常包括对现有索引的调整和新索引的创建建议,以提升数据库查询性能。

除了索引优化建议,SQLAdvisor在公司内部得到广泛应用,其开源性质意味着任何开发者或DBA都可以自由地使用甚至改进这个工具。代码托管在GitHub上,既方便了用户的下载和使用,也鼓励了社区的贡献和反馈,形成了积极的开发与维护生态。

SQLAdvisor 的特点

  • 基于 MySQL 原生词法解析,充分保证词法解析的性能、准确定以及稳定性; 

  • 支持常见的 SQL(Insert/Delete/Update/Select); 

  • 支持多表 Join 并自动逻辑选定驱动表; 

  • 支持聚合条件 Order by 和 Group by; 

  • 过滤表中已存在的索引。 

SQLAdvisor架构流程图

图片

Join 处理

Join语法分为两种:Join on 和 Join using,并且 Join on 有时会存在 where 条件中。

分析 Join 条件首先会得到一个 nested_join 的 table list,通过判断它的 join_using_fields 字段是否为空来区分 Join on 与 Join using。

生成的 table list 以二叉树的形式进行存储,以后序遍历的方式对二叉树进行遍历。

生成内部解析树时,right Join 会转换成 left Join。

Join 条件会存在当层的叶子节点上,如果左右节点都是叶子节点,会存在右叶子节点。

每一个非叶子节点代表一次 Join 的结果。

上述实现时,涉及的函数为:mysql_sql_parse_join(TABLE_LIST *join_table) mysql_sql_parse_join(Item *join_condition) ,主要流程图如下:

图片

where 处理

主要是提取 SQL 语句的 where 条件。where 条件中一般由 AND 和 OR 连接符进行连接,因为 OR 比较难以处理,所以忽略,只处理 AND 连接符。

由于 where 条件中可以存在 Join 条件,因此需要进行区分。

依次获取 where 条件,当条件中的操作符是 like,如果不是前缀匹配则丢弃这个条件。

根据条件计算字段的区分度按照高低进行倒序排,如果小于30则丢弃。同时使用最左原则将 where 条件进行有序排列。

Group 与 Order 处理

Group 字段与 Order 字段能否用上索引,需要满足如下条件:> * 涉及到的字段必须来自于同一张表,并且这张表必须是确定下来的驱动表。> * Group by 优于 Order by, 两者只能同时存在一个。> * Order by 字段的排序方向必须完全一致,否则丢弃整个 Order by 字段列。> * 当 Order by 条件中包含主键时,如果主键字段为 Order by。字段列末尾,忽略该主键,否则丢弃整个 Order by 字段列。

整个索引列排序优先级:等值>(group by | order by )> 非等值。

该过程中设计的函数主要有:> * mysql_sql_parse_group() 判断 Group 后的字段是否均来自于同一张表。> * mysql_sql_parse_order() 判断 Order 后的条件是否可以使用。> * mysql_sql_parse_group_order_add() 将字段依次按照规则添加到备选索引链表中。

图片

输出建议

通过上述步骤,已经将每张表的备选索引键全部保存。此时,只要判断每张表中的候选索引键是否在实际表中已存在。没有索引,则给出建议增加对应的索引。

该步骤涉及的函数是:print_index() ,主要的流程图为:

图片

相关链接

开源地址:https://github.com/Meituan-Dianping/SQLAdvisor

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爆改YOLOv8|利用yolov10的C2fCIB改进yolov8-高效涨点

1,本文介绍 本文介绍了一种改进机制,通过引入 YOLOv10 的 C2fCIB 模块来提升 YOLOv8 的性能。C2fCIB 模块中的 CIB(Compact Inverted Bottleneck)结构采用了高效的深度卷积进行空间特征混合,并使用点卷积进行通道特征…

PLM系统在企业数字化转型中的关键作用 三品PLM在制造业转型实例分析

在当今数字化时代,企业面临着日益激烈的市场竞争和快速变化的客户需求。为了保持竞争力并实现可持续发展,企业纷纷进行数字化转型。而PLM产品生命周期管理系统作为数字化转型的关键组成部分,其在企业中的应用显得尤为重要。本文将探讨PLM系统…

AAA原理与配置

定义 AAA是Authentication(认证)、Authorization(授权)和Accounting(计费)的简称,是网络安全的一种管理机制,提供了认证、授权、计费三种安全功能。 这三种安全功能的具体作用如下…

Java如何计算一个数的阶乘末尾有多少个零?

文章有点长,请耐心看完~~~ 这个问题涉及到阶乘(factorial)的一个有趣特性,即阶乘结果末尾零的数量。要理解这一点,我们首先要知道什么情况下一个数的末尾会产生零。 什么情况下一个数的末尾会产生零 在十进制数制中…

代码随想录训练营day35|46. 携带研究材料,416. 分割等和子集

46. 携带研究材料 思路:用一个数组来记录?dp[i]带i件物品的最大价值 好吧,这里用的是一个二维数组dp[i][j],表示从[0,i]的物间任选武平,能用容量为j的背包装下的最大价值 重量 价值 物品0 1 15 物品1 3 2…

AI绘画|Stable Diffusion高质量提示词收集(附提示词手册以及提示词插件)

使用平台:comfyui 模型:AlbedoBase-XL 图片尺寸:768x1280 提示词万字手册,可以扫描下方,免费获取 图1 提示词 an attractive rough cyborg woman with a serious look in her eyes, messy conceptual felt-tip pen (drawing:1.3) by (Yoji Shinkawa:…

“三年级英语”暴增5亿搜索量?需求来了!附2个极品AI吸粉玩法!

家人们!在英语细分领域,一直都是付费知识中的风口黄金大赛道。 而这两天“英语”这个关键词,在微信指数上的日搜索量突然猛增到5个亿。 这两天全网热词“三年级英语”,日环比搜索指数更是486.2%增长率,一天时间内就增…

vsftpd的安装和配置

目录 vsftpd的下载与配置 下载vsftpd vsftpd的配置 测试服务的功能 vsftpd的下载与配置 下载vsftpd rpm -qc vsftpd,检查vsftpd安装包是否存在,存在则不需要安装。 yum install -y vsftpd,不存在则yum安装vsftpd。 安装成功 vsftpd的…

早上醒来嗓子干、喉咙痛、咳嗽……快用这个润养好物,给嗓子做个spa,让身体润起来~

进入秋季,很多人出现了眼睛干涩、大便干燥、嘴唇干裂、咽喉疼痛等症状,虽说这些还能够忍受,但它却影响了正常的饮食和休息。 秋季气候干燥,外界燥邪侵犯肺部,易伤津液,肺失滋润,清肃失司&#x…

宣布 Vue 3.5 版发布

宣布 Vue 3.5 版发布 今天我们很高兴地宣布 Vue 3.5 版“天元突破红莲螺岩”正式发布! 这一小版本发布没有破坏性更改,包括内部改进和一些有用的新特性。我们将在这篇博客中介绍一些亮点 - 详细的更改和新特性请查阅 GitHub 上的完整变更日志。 响应式…

单片机上搭配的SPI NOR FLASH容量告急!扩容新选择

文章目录 前言:正文: 为便于理解并省去容量单位转换的麻烦,以下容量单位均使用Byte单位(128Mbit16MByte) 前言: NOR FLASH 是市场上两种主要的非易失闪存技术之一。Intel于1988年首先开发出NOR Flash 技术…

代码审计总结

代码审计总结 概述 一、代码审计 1.1什么是代码审计? 1.2为什么要执行代码审核? 1.3代码审计的好处 二、代码审计流程 2.1代码检查方法 2.2代码检查项目 2.3编码规范 2.4代码检查规范 2.5缺陷检查表 2.6代码审计复查 2.7代码审计结果总结 三…

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)

概述 从 WWDC 23 开始,苹果推出了全新的数据库框架 SwiftData。它借助于 Swift 语言简洁而富有表现力的特点,抛弃了以往数据库所有的额外配置文件,只靠纯代码描述就可以干脆利索的让数据库的创建和增删改查(CRUD)一气…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司,随着公司的快速发展,业务方向越来越多,对中间件的依赖也越来越紧密,中间件的集群的数量成倍数增长,在中间件的部署,使用,以及运维出现各种问题。 1.中间件与业…

CAD图纸防泄密有哪些方法?五个防泄密方法分享

CAD图纸作为工程设计的重要资料,其防泄密工作至关重要。以下将分享五个有效的CAD图纸防泄密方法,旨在确保图纸的安全性和机密性。 1. 使用CAD软件自带的加密功能 大多数CAD软件,如AutoCAD,都内置了加密功能。在保存CAD图纸时&am…

MySQL主从复制(Linux篇)

1.概述 MySQL的主从复制(Master-Slave Replication)是一种数据复制解决方案,将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而是的从库…

MES系统:现代工厂生产车间的科技与管理创新

一、现代工厂生产车间:高度集成、自动化与智能化 在当今这个日新月异的工业时代,工厂生产车间已经远远超越了传统意义上的简单生产线概念,它们正逐步演变为一个高度集成、自动化与智能化的生态系统。这一变革不仅极大地提升了生产效率&#…

实战项目:俄罗斯方块(七)

文章目录 🍊自我介绍🍊图形存储及输出设置类型设计图形输出代码设计要实现的结果展示user_global.c(全局变量的C文件)user_print.huser_print.cmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一…

股指期货与股指期权为什么是熊市中的风险管理利器?

在如今波动剧烈的熊市环境中,期货市场的多空双边机制和T0的交易制度显得尤为灵活和必要。对于投资者而言,利用期货市场对冲股票现货风险成为了一种重要的策略。在期货市场中,股指期货、股指期权以及股票期权是三大得力工具,它们为…

Windows下安装ELK8(elasticsearch、logstash、kibana)及相关工具插件

目录 概述 ELK简介 安装elasticsearch 下载elasticsearch 解压 配置不用登录及关闭SSL 启动elasticsearch 访问elasticsearch 安装elasticsearch-head 提前准备node.js 下载elasticsearch-head 解压 浏览器打开index.html 安装kibana 下载kibana 解压 运行kib…