一、簡介
在數據庫運維過程中,優化SQL是業務團隊與DBA團隊的日常任務。例行SQL優化,不僅可以提升程序性能,還能夠降低線上故障的概率。
目前常用的SQL優化方式包括但不限於:業務層優化、SQL邏輯優化、索引優化等。其中索引優化通常通過調整索引或新增索引從而達到SQL優化的目的。索引優化往往可以在短時間內產生非常巨大的效果。如果能夠將索引優化轉化成工具化、標准化的流程,減少人工介入的工作量,無疑會大大提高DBA的工作效率
SQLAdvisor是由美團點評公司DBA團隊(北京)開發維護的SQL優化工具:輸入SQL,輸出索引優化建議。 它基於MySQL原生詞法解析,再結合SQL中的where條件以及字段選擇度、聚合條件、多表Join關系等最終輸出最優的索引優化建議。目前SQLAdvisor在公司內部大量使用,較為成熟、穩定。
美團點評致力於將SQLAdvisor打造成一款高智能化SQL優化工具,選擇將已經在公司內部使用較為成熟的、穩定的SQLAdvisor項目開源,github地址。希望與業內有類似需求的團隊,一起打造一款優秀的SQL優化產品。
目前SQLAdvisor在美團點評內部廣泛應用,公司內部對SQLAdvisor的開發全面轉到github上,開源和內部使用保持一致。
主要功能:輸出SQL索引優化建議
GitHup地址:https://github.com/Meituan-Dianping/SQLAdvisor
二、SQLAdvisor安裝
2.1 拉取最新代碼
$ git clone https://github.com/Meituan-Dianping/SQLAdvisor.git
2.2 安裝依賴項
$ yum install cmake libaio-devel libffi-devel glib2 glib2-devel
跟據glib安裝的路徑,修改SQLAdvisor/sqladvisor/CMakeLists.txt中的兩處include_directories針對glib設置的path。glib yum安裝默認不需要修改路徑。
另外,編譯sqladvisor時依賴perconaserverclient_r, 因此需要安裝Percona-Server-shared-56。
# 配置Percona56 yum源;
$ yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
# 安裝Percona-Server-shared-56;
$ yum install Percona-Server-shared-56
如果yum安裝不行,可以采用rpm包手動安裝。參考:https://github.com/Meituan-Dianping/SQLAdvisor/issues/12
###########采用rpm包手動安裝##########
下載 tar 包
wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.25-73.1/binary/redhat/6/x86_64/Percona-Server-5.6.25-73.1-r07b797f-el6-x86_64-bundle.tar
解壓
tar -zxvf Percona-Server-5.6.25-73.1-r07b797f-el6-x86_64-bundle.tar
找到對應包,安裝即可。
rpm -ivh Percona-Server-shared-56-5.6.25-rel73.1.el6.x86_64.rpm
我使用這個方案:
解壓的時候報錯了:
tar -zxvf Percona-Server-5.6.25-73.1-r07b797f-el6-x86_64-bundle.tar
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
然后換成:tar -xvf Percona-Server-5.6.25-73.1-r07b797f-el6-x86_64-bundle.tar(去掉z參數)
之后執行安裝:
warning: Percona-Server-shared-56-5.6.25-rel73.1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
##################################
需要配置軟鏈接:
$ rpm -ql Percona-Server-shared-56 /usr/lib64/libperconaserverclient.so.18 /usr/lib64/libperconaserverclient.so.18.1.0 /usr/lib64/libperconaserverclient_r.so.18 /usr/lib64/libperconaserverclient_r.so.18.1.0 $ cd /usr/lib64/ $ ln -s libperconaserverclient_r.so.18 libperconaserverclient_r.so 2.3 編譯依賴項sqlparser $ cd /root/SQLAdvisor/ $ cmake -DBUILD_CONFIG=mysql_release -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr/local/sqlparser ./ $ make && make install
注意
DCMAKE_INSTALL_PREFIX為sqlparser庫文件和頭文件的安裝目錄,其中lib目錄包含庫文件libsqlparser.so,include目錄包含所需的所有頭文件。
DCMAKE_INSTALL_PREFIX值盡量不要修改,后面安裝依賴這個目錄。
2.4 安裝SQLAdvisor源碼
$ cd /root/SQLAdvisor/sqladvisor/
安裝完成后,在本路徑下生成一個sqladvisor可執行文件,這即是我們想要的。
可以把可執行文件sqladvisor復制到PATH路徑中。
1
|
$ cp -frp /root/SQLAdvisor/sqladvisor/sqladvisor /usr/local/bin/
|
三、SQLAdvisor使用
2.1 幫助輸出
$ sqladvisor --help Usage: sqladvisor [OPTION...] sqladvisor SQL Advisor Summary Help Options: -?, --help Show help options Application Options: -f, --defaults-file sqls file -u, --username username -p, --password password -P, --port port -h, --host host -d, --dbname database name -q, --sqls sqls -v, --verbose 1:output logs 0:output nothing
2.2 命令行傳參調用
$ sqladvisor -h xx -P xx -u xx -p 'xx' -d xx -q "sql" -v 1
2.3 配置文件傳參調用
$ cat sql.cnf [sqladvisor] username=xx password=xx host=xx port=xx dbname=xx sqls=sql1;sql2;sql3....
$ sqladvisor -f sql.cnf -v 1
2.4 測試使用
$ cat sqladvisor.cnf [sqladvisor] username=root password=zabbix host=localhost port=3306 dbname=blog sqls=SELECT * FROM wp_posts where post_date>"2015-07-16 18:44:27";
$ sqladvisor -f sqladvisor.cnf -v 1 2017-04-13 17:39:59 23848 [Note] 第1步: 對SQL解析優化之后得到的SQL:select `*` AS `*` from `blog`.`wp_posts` where (`post_date` > '2015-07-16 18:44:27') 2017-04-13 17:39:59 23848 [Note] 第2步:開始解析where中的條件:(`post_date` > '2015-07-16 18:44:27') 2017-04-13 17:39:59 23848 [Note] show index from wp_posts 2017-04-13 17:39:59 23848 [Note] show table status like 'wp_posts' 2017-04-13 17:39:59 23848 [Note] select count(*) from ( select `post_date` from `wp_posts` FORCE INDEX( PRIMARY ) order by ID DESC limit 3763) `wp_posts` where (`post_date` > '2015-07-16 18:44:27') 2017-04-13 17:39:59 23848 [Note] 第3步:表wp_posts的行數:7527,limit行數:3763,得到where條件中(`post_date` > '2015-07-16 18:44:27')的選擇度:1 2017-04-13 17:39:59 23848 [Note] 第4步:表wp_posts 的SQL太逆天,沒有優化建議 2017-04-13 17:39:59 23848 [Note] 第5步: SQLAdvisor結束!
四、SQLAdvisor工作原理
詳情看:SQLAdvisor架構和實踐
五、SQLAdvisor Web
美團開源出來的SQLAdvisor SQL優化建議工具只有命令行,所以有網友就針對這個開發出了Web版本,告別命令行。
GitHub地址:https://github.com/zyw/sqladvisor-web
項目中使用的美團SQL分析工具是在CentOS上編譯的,所以建議部署到CentOS上。
該項目是使用Python的Flask框架開發的。
使用CentOS自帶的Python版本,版本號是2.7.5。
安裝sqladvisor-web
下載依賴:
yum install python-devel mysql-community-devel -y
下載源碼:
git clone https://github.com/zyw/sqladvisor-web.git
安裝依賴:
cd sqladvisor-web
pip3 install django_admin_bootstrapped
pip install -r requirements.txt
修改數據庫配置
vim config.py
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or 'mysql://root:root@localhost/sqladvisor'
其中把第二個root修改成你安裝Mysql時設置的密碼
初始化數據庫:
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
啟動系統:
解壓sqlparser.tar.gz到/usr/local
python manage.py runserver --host 0.0.0.0 &
默認監聽5000端口,此時安裝完成