dba+開源工具:讓數據庫查詢快如閃電!自動判斷條件字段是否增加索引工具
sql_helper工具簡介
索引在數據庫中非常重要,它可以加快查詢速度并提高數據庫性能。對于經常被用作查詢條件的字段,添加索引可以顯著改善查詢效率。然而,索引的創建和維護需要考慮多個因素,包括數據量、查詢頻率、更新頻率等。
sql_helper工具是一個開源項目,它提供命令行模式和Web端接口兩種方式使用,其主要功能是自動判斷條件字段是否需要增加索引,適用于MySQL5.7/8.0和MariaDB數據庫,旨在幫助開發人員優化數據庫查詢性能。通過分析SQL語句,該工具可以檢測出哪些條件字段可以考慮添加索引來提高查詢效率。
工作流程
第一步:通過SQL語法解析器,提煉出表名,別名,關聯字段名,條件字段名,排序字段名,分組字段名。
第二步:檢查是否有where條件,如沒有則給出提示。
第三步:檢測到a join b on a.id = b.id(關聯查詢時),通過查詢表結構,檢查關聯字段是否有索引,如沒有給出創建索引提示。
第四步:通過調用Explain執行計劃,如果type值是ALL,或者rows大于1000,檢查該表(如有別名,找到其對應的原始表名)和where條件字段的數據分布,工具默認會采樣10萬條數據作為樣本,檢查Cardinality基數,例如sex性別字段,有男女兩個值,如果占比超過半數(50%),則不建議對該字段創建索引。
第五步:檢查group by和order by字段(同樣的算法),之后與where條件字段合并,組合成聯合索引。
第六步:檢查這些字段之前是否創建過索引,如果沒有給予提示創建,如果之前就有索引,則不提示。
需要注意的是:sql_helper工具假定你的SQL語句條件表達式都為and的前提下,提示創建聯合索引。如果是or,SQL解析器解析起來會有些困難(SQL靈活多變,且不固定,無法用通用的算法組合字段)。
例如where c1 = 1 or c2 = 2
工具會提示(c1,c2)創建一個聯合索引,但實際上應該單獨對c1和c2創建一個獨立索引。
即select ... from t where c1 = 1
union all
select ... from t where c2 = 2
命令行方式使用
shell> chmod 755 sql_helper
shell> ./sql_helper -f test.yaml -q 'select * from sbtest1 limit 1;'
- 注:test.yaml為MySQL配置文件。
--sample參數:默認采樣10萬條數據(你可以在從庫上獲取樣本數據),根據你的實際情況,適當增加采樣數據,比如100-1000萬行,這樣工具會更精準的判斷是否添加索引。
僅支持SELECT查詢(主要針對慢日志里的SQL)。
圖片
請注意,自動判斷是否增加索引只是一個輔助功能,最終的決策還應該根據具體的業務需求以及對數據庫性能優化的考慮來進行。此外,索引的創建和維護需要謹慎操作,需要考慮數據量、查詢頻率、更新頻率等因素,避免對數據庫性能產生負面影響。
- 工具適用于Centos7系統。