美团点评SQL优化工具SQLAdvisor开源
介绍
在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提升程序性能,还能够降低线上故障的概率。
目前常用的 SQL 优化方式包括但不限于:业务层优化、SQL逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目的。索引优化往往可以在短时间内产生非常巨大的效果。如果能够将索引优化转化成工具化、标准化的流程,减少人工介入的工作量,无疑会大大提高DBA的工作效率。
SQLAdvisor 是由美团点评公司北京DBA团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议。 它基于 MySQL 原生词法解析,再结合 SQL 中的 where 条件以及字段选择度、聚合条件、多表 Join 关系等最终输出最优的索引优化建议。目前 SQLAdvisor 在公司内部大量使用,较为成熟、稳定。
现在,我们非常高兴地将 SQLAdvisor 开源,项目 GitHub 地址:https://github.com/Meituan-Dianping/SQLAdvisor 。我们已经把相关开发工作全面转到 GitHub 上,开源版本和内部使用版本保持完全一致。希望与业内有类似需求的团队,一起打造一款优秀的 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 处理
上述实现时,涉及的函数为:mysql_sql_parse_join(TABLE_LIST join_table) mysql_sql_parse_join(Item join_condition) ,主要流程图如下:
where 处理
计算区分度
- 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() 计算选择度。
添加备选索引
Group 与 Order 处理
- 涉及到的字段必须来自于同一张表,并且这张表必须是确定下来的驱动表。
- Group by 优于 Order by, 两者只能同时存在一个。
- Order by 字段的排序方向必须完全一致,否则丢弃整个 Order by 字段列。
- 当 Order by 条件中包含主键时,如果主键字段为 Order by。 字段列末尾,忽略该主键,否则丢弃整个 Order by 字段列。
- mysql_sql_parse_group() 判断 Group 后的字段是否均来自于同一张表。
- mysql_sql_parse_order() 判断 Order 后的条件是否可以使用。
- mysql_sql_parse_group_order_add() 将字段依次按照规则添加到备选索引链表中。
驱动表选择
添加被驱动表备选索引
输出建议
SQLAdvisor版本更新
- Functionality Added or Changed
- 调整架构将 SQLParser 与 SQLAdvisor 模块隔离,方便调试。
- 重新架构多表 Join 关系的 find_join_elements() 函数,思路更加清晰。
- 修改选定驱动表的策略,确保驱动表为小结果集。
- 添加 where 条件中的 like 处理。
- 优化 Order by 逻辑,忽略 Order by primary key 场景。
- 输出索引建议前,增加判断索引是否已存在。
- Bugs Fixed
- 修复 SQL 无法处理中文问题。
- 修复字段多次出现在 where 条件中从而导致多次出现在索引列中问题。
- 修复在 find_best_index() 函数中,对 MySQL API 中的 result 对象提前 free,导致指针失效问题。
愿景
和各位同行共同打造一款企业级优秀的 SQL 优化产品,希望大家能够积极参与。
欢迎大家将需求或发现的 Bug 在 Github 上提交 issue,帮助 SQLAdvisor 逐渐壮大;也欢迎大家在 SQLAdvisor 用户交流群(QQ: 231434335)相互交流,共同学习。
SQLAdvisor手册
总结
以上是生活随笔为你收集整理的美团点评SQL优化工具SQLAdvisor开源的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 并发编程(四):也谈谈数据库的锁机制
- 下一篇: 我的MYSQL学习心得(4) : 数据类