美团开源 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 的优点
基于 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 条件进行有序排列。
计算区分度
通过 “show table status like” 获得表的总行数 table_count。
通过计算选择表中已存在的区分度最高的索引 best_index,同时Primary key > Unique key > 一般索引。
通过计算获取数据采样的起始值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() 计算选择度。

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

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() 将字段依次按照规则添加到备选索引链表中。


驱动表选择
经过前期的 where 解析、Join 解析,已经将 SQL 中表关联关系存储起来,并且按照一定逻辑将候选驱动表确定下来。
在侯选驱动表中,按照每一张表的侯选索引字段中第一个字段进行计算表中结果集大小。
使用 explain select * from table where field 来计算表中结果集。
结果集小最小的被确为驱动表。
步骤中涉及的函数为:final_table_drived(),在该函数中,调用了函数 get_join_table_result_set() 来获取每张驱动候选表的行数。
添加被驱动表备选索引
通过上述过程,已经选择驱动表,也通过解析保存了语句中的条件。
由于选定了驱动表,因此需要对被驱动表的索引,根据 Join 条件进行添加。
该过程涉及的函数主要是:mysql_index_add_condition_field(),流程如下:

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

美团开源 SQL 优化工具 SQLAdvisor的更多相关文章
- 美团点评SQL优化工具SQLAdvisor开源快捷部署
美团点评SQL优化工具SQLAdvisor开源快捷部署 git clone https://github.com/Meituan-Dianping/SQLAdvisor.gityum install ...
- 美团SQL优化工具SQLAdvisor
介绍 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 SQL 优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的 SQL 优化方式包括但不限于:业务层优化.SQL逻 ...
- SQL优化工具SQLAdvisor使用
一.简介在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑优 ...
- SQL优化工具SQLAdvisor使用(转)
一.简介 在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑 ...
- Ubuntu 美团sql优化工具SQLAdvisor的安装(转)
by2009 by2009 发表于 3 个月前 SQLAdvisor简介 SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具.它基于MySQ ...
- centos下美团sql优化工具SQLAdvisor的安装
1.克隆代码 cd /usr/local/src/git clone https://github.com/Meituan-Dianping/SQLAdvisor.git 2.安装依赖(ubuntu下 ...
- Centos7安装美团SQL优化工具SQLAdvisor
1 下载源码 git clone https://github.com/Meituan-Dianping/SQLAdvisor.git 2 安装依赖环境 yum install cmake libai ...
- sql优化工具SQLAdvisor的安装
原文地址:https://www.cnblogs.com/beliveli/articles/6541936.html 本机安装包路径: D:\share\src\linux-mysql\sqlAdv ...
- 小米 SOAR 开源SQL优化工具安装
github :https://github.com/xiaomi/soar 安装说明 :https://github.com/XiaoMi/soar/blob/master/doc/install. ...
随机推荐
- python-反射、新式类与经典类搜索的优先级
preface include: getattr setattr delattr hasattr class webserver(object): def __init__(self,num): se ...
- python字符串 分片索引
字符串是字符的有序集合,可以通过其位置来获得具体的元素.在python中,字符串中的字符是通过索引来提取的,索引从0开始. python可以取负值,表示从末尾提取,最后一个为-1,倒数第二个为-2,即 ...
- Linux下安装或升级Python 2.7
1.准备编译环境gcc 2.去官网下载要安装的对应版本的python的源代码 下载地址:https://www.python.org/downloads/source/ 你可以选择你要下载的版本,用w ...
- redis配置文件相关
1. 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes daemonize no 2. 当Redis在后台运行时,Redis默认会把pid写入/var/run/red ...
- 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式
8.4.6 基于XML配置文件的管理方式 Spring 2.x 提供一个新的aop:命名空间来定义切面.切入点和增强处理. XML配置方式优点: ⊙ 如果应用没有使用JDK 1.5 以上版本,那么应用 ...
- Git Step by Step – (7) Git远程仓库(续)
上一篇文章介绍了Git远程仓库的一些使用,但是还是有些东西需要补充一下,所以有了这个续篇. .gitignore 前一篇中,我们介绍了Git的patch功能,当我们生成patch之后,"gi ...
- 【Cesium】模型转换和使用(转)
http://52.4.31.236/convertmodel.html https://blog.csdn.net/UmGsoil/article/details/74572877 var view ...
- HBase--阿里未来发展
最近家里没网络,在公司加班写哈博客. HBase是一个开源的非关系型分布式数据库(NoSQL),基于谷歌的BigTable建模,是一个高可靠性.高性能.高伸缩的分布式存储系统,使用HBase技术可在廉 ...
- Android开发-- The content of the adapter has changed but ListView did not receive a notification - With AsyncTask
最近在联系开发DaysMatter时遇到一个问题: app中使用ListView来展示所有事件,每次添加完事件后使用下面代码来更新ListView. toDoListView.refreshDrawa ...
- js防止表单重复提交
1.表单 <form id="addForm" onsubmit="getElementById('submitInput').disabled=true;retu ...