美团开源 SQL 优化工具 SQLAdvisor

https://www.oschina.net/news/82725/sqladvisor-opensource

https://github.com/Meituan-Dianping/SQLAdvisor

SQLAdvisor 是由美团点评公司北京 DBA 团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议,现已开源。 它基于 MySQL 原生词法解析,再结合 SQL 中的 where 条件以及字段选择度、聚合条件、多表 Join 关系等最终输出最优的索引优化建议。开发团队称目前 SQLAdvisor 在美团内部大量使用,较为成熟、稳定,且开源版本和内部使用版本保持完全一致,希望与业内有类似需求的团队,一起打造一款优秀的 SQL 优化产品。

SQLAdvisor 架构流程图:

SQLAdvisor 使用举例

sql: SELECT id FROM crm_loan WHERE id_card = ‘1234567‘
cmd: ./sqladvisor -h xx -P xx -u xx -pxx -d xx -q "SELECT id FROM crm_loan WHERE id_card = ‘1234567‘"
SQLAdvisor输出: alter table crm_loan add index idx_id_card(id_card)

SQLAdvisor 快速入门教程

SQLAdvisor 的优点

  • 基于 MySQL 原生词法解析,充分保证词法解析的性能、准确定以及稳定性;
  • 支持常见的 SQL(Insert/Delete/Update/Select);
  • 支持多表 Join 并自动逻辑选定驱动表;
  • 支持聚合条件 Order by 和 Group by;
  • 过滤表中已存在的索引。

SQLAdvisor 原理介绍

Join 处理

  1. Join语法分为两种:Join on 和 Join using,且 Join on 有时会存在 where 条件中。
  2. 分析 Join 条件首先会得到一个 nested_join 的 table list,通过判断它 join_using_fields 字段是否为空来区分 Join on 与 Join using。
  3. 生成的 table list 以二叉树的形式进行存储,以后序遍历的方式对二叉树进行遍历。
  4. 生成内部解析树时,right Join 会转换成 left Join。
  5. Join 条件会存在当层的叶子节点上,如果左右节点都是叶子节点,会存在右叶子节点。
  6. 每一个非叶子节点代表一次 Join 的结果。

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

where 处理

  1. 主要是提取 SQL 语句的 where 条件。where 条件中一般由 AND 和 OR 连接符进行连接,因为 OR 比较难以处理,所以忽略,只处理 AND 连接符。
  2. 由于 where 条件中可以存在 Join 条件,因此需要进行区分。
  3. 依次获取 where 条件,当条件中的操作符是 like,如果不是前缀匹配则丢弃这个条件。
  4. 根据条件计算字段的区分度按照高低进行倒序排,如果小于30则丢弃。同时使用最左原则将 where 条件进行有序排列。

计算区分度

  1. 通过 “show table status like” 获得表的总行数 table_count。
  2. 通过计算选择表中已存在的区分度最高的索引 best_index,同时Primary key > Unique key > 一般索引。
  3. 通过计算获取数据采样的起始值offset与采样范围rand_rows:
    • offset = (table_count / 2) > 10W ? 10W : (table_count / 2)
    • rand_rows =(table_count / 2) > 1W ? 1W : (table_count / 2)
    • 使用select count(1) from (select field from table force index(best_index) order by cl.. desc limit rand_rows) where field_print 得到满足条件的rows。
    • cardinality = rows == 0 ? rand_rows : rand_rows / rows;
    • 计算完成选择度后,会根据选择度大小,将该条件添加到该表中的备选索引中。

主要涉及的函数为:mysql_sql_parse_field_cardinality_new() 计算选择度。

添加备选索引

  1. mysql_sql_parse_index()将条件按选择度添加到备选索引链表中。
  2. 上述两函数的流程图如下所示:

Group 与 Order 处理

  1. Group 字段与 Order 字段能否用上索引,需要满足如下条件:
    • 涉及到的字段必须来自于同一张表,并且这张表必须是确定下来的驱动表。
    • Group by 优于 Order by, 两者只能同时存在一个。
    • Order by 字段的排序方向必须完全一致,否则丢弃整个 Order by 字段列。
    • 当 Order by 条件中包含主键时,如果主键字段为 Order by。 字段列末尾,忽略该主键,否则丢弃整个 Order by 字段列。
  2. 整个索引列排序优先级:等值>(group by | order by )> 非等值。
  3. 该过程中设计的函数主要有:
    • mysql_sql_parse_group() 判断 Group 后的字段是否均来自于同一张表。
    • mysql_sql_parse_order() 判断 Order 后的条件是否可以使用。
    • mysql_sql_parse_group_order_add() 将字段依次按照规则添加到备选索引链表中。

驱动表选择

  1. 经过前期的 where 解析、Join 解析,已经将 SQL 中表关联关系存储起来,并且按照一定逻辑将候选驱动表确定下来。
  2. 在侯选驱动表中,按照每一张表的侯选索引字段中第一个字段进行计算表中结果集大小。
  3. 使用 explain select * from table where field 来计算表中结果集。
  4. 结果集小最小的被确为驱动表。
  5. 步骤中涉及的函数为:final_table_drived(),在该函数中,调用了函数 get_join_table_result_set() 来获取每张驱动候选表的行数。

添加被驱动表备选索引

  1. 通过上述过程,已经选择驱动表,也通过解析保存了语句中的条件。
  2. 由于选定了驱动表,因此需要对被驱动表的索引,根据 Join 条件进行添加。
  3. 该过程涉及的函数主要是:mysql_index_add_condition_field(),流程如下:

输出建议

  1. 通过上述步骤,已经将每张表的备选索引键全部保存。此时,只要判断每张表中的候选索引键是否在实际表中已存在。没有索引,则给出建议增加对应的索引。
  2. 该步骤涉及的函数是:print_index() ,主要的流程图为:

原文地址:https://www.cnblogs.com/YuyuanNo1/p/9895452.html

时间: 2024-11-08 22:39:24

美团开源 SQL 优化工具 SQLAdvisor的相关文章

Centos7安装美团SQL优化工具SQLAdvisor

1 下载源码 git clone https://github.com/Meituan-Dianping/SQLAdvisor.git 2 安装依赖环境 yum install cmake libaio-devel libffi-devel glib2 glib2-devel bison gcc gcc-c++ yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1

(MYSQL)SQL优化工具 - SQLAdvisor 安装使用详解

一.SQLAdvisor简介 SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具.它基于MySQL原生态词法解析,结合分析SQL中的where条件.聚合条件.多表Join关系 给出索引优化建议.目前SQLAdvisor在美团点评广泛应用,包括美团支付.酒店旅游.外卖.团购等产品线,公司内部对SQLAdvisor的开发全面转到github上,开源和内部使用保持一致. 二.SQLAdvisor安装 1.拉取最新代码 git clone ht

centos7下安装sql优化工具SQLAdvisor

1.克隆代码 #cd /usr/local/src/ #git clone https://github.com/Meituan-Dianping/SQLAdvisor.git 2.安装依赖包 #yum install -y make cmake libaio-devel libffi-devel glib2 glib2-devel bison gcc gcc-c++ 3.编译sqladvisor时依赖perconaserverclient_r, 因此需要安装Percona-Server-sha

sql优化工具SQLAdvisor的安装

本机安装包路径: D:\share\src\linux-mysql\sqlAdvisor\ 1.克隆代码git clone https://github.com/Meituan-Dianping/SQLAdvisor.git 2.安装依赖yum install -y cmake libaio-devel libffi-devel glib2 glib2-devel bison 3.安装percona56yum install http://www.percona.com/downloads/pe

[SQL优化工具]Quest.Central.For.Databases——SQL Tuning for SQL Server

随着企业数据库的急剧膨胀和日益复杂,DBA为保证数据库性能所付出的努力与日俱增,手工或使用多种无法集成的管理工具,都会给日常管理和维护带来不必要的困难. Quest Central for Databases 是一种集成化.图形化.跨平台的数据库管理解决方案,可以管理异构环境下的 Oracle.DB2 和 SQL server 数据库.Quest Central for Databases 消除了企业IT人员管理多种数据库时面临的技术障碍,提高了IT人员工作效率,改善了数据库性能和数据库应用的可

SQL索引优化工具SQLAdvisor介绍

SQLAdvisor是美团开源的一款SQL索引优化建议工具,是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具.它基于MySQL原生态词法解析,结合分析SQL中的where条件.聚合条件.多表Join关系 给出索引优化建议.目前SQLAdvisor在美团点评内部广泛应用,公司内部对SQLAdvisor的开发全面转到github上,开源和内部使用保持一致. 博文记录对该工具的初步安装和基本使用 一.软件的安装部署 [[email protected] opt

SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN具QI. 开始装逼... 首先来一条执行效率不怎么样的SQL语句 将SQL Server Profiler中的跟踪文件保存至本地 打开数据库优化引擎,选择工作负荷文件以及需要优化的数据库/表,点击开始分析 分析结束后会给你索引建议,执行操作→应用建议,将会自动生成SQL语句并执行,完成后再执行试试那

数据库SQL优化大总结之百万级数据库优化方案

网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到.纠正以及补充. 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id f

数据库SQL优化大总结之 百万级数据库优化方案

作者:雲霏霏 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到.纠正以及补充. 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: sele