美团点评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开源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并发编程(四):也谈谈数据库的锁机制
- 下一篇: 聊聊clean code