作為MYSQL DBA需要定期的查看服務器的索引情況,尤其是當你到了一個新的環境,開始接手一些數據庫的維護工作,需要對線上服務器的索引使用情況有所了解。如果索引設置不合理,會導致服務器的性能受到非常大的影響,尤其是當SQL語句又比較復雜(比如多表聯合查詢等),本來就來大致介紹一下線上數據庫的索引改造,本文只是對個人的工作總結,如果大家有更好的索引改造方案,也請指點。
這裡提到的索引改造主要分成如下幾個階段:
一、去除重復的索引 www.2cto.com
1. 為什麼要去除重復的索引
A. 多余的索引占用磁盤空間,會引起不必要的磁盤io
B. 多余的索引會導致數據庫在進行索引選擇的時候變慢,尤其是索引越多的時候越突出(主要是相關聯的索引才會影響索引選擇)
C. 重復的索引會導致表的更新變慢
2. 如何找出重復的索引
這裡給大家介紹一個好用的Maatkit工具,Maatkit工具安裝完成以後就會有一個mk-duplicate-key-checker命令,這個命令就是檢測數據庫中存在的重復索引,並會自動生成刪除重復索引的語句,非常方便。
下面介紹Maatkit工具的安裝和mk-duplicate-key-checker命令的使用。
Maatkit工具的安裝:
wget http://maatkit.googlecode.com/files/maatkit-7540.tar.gz
tar zxvf maatkit-7540.tar.gz
cd maatkit-7540 www.2cto.com
perl Makefile.PL
make install
mk-duplicate-key-checker命令的使用:
mk-duplicate-key-checker --databases=databasename --user=root --password=passwd
這裡只需要制定數據庫名,用戶名以及密碼,如果還想知道其他的一些參數,可以使用命令mk-duplicate-key-checker –help查看。
備注:提醒大家一下,在執行完刪除重復索引的語句之後,還需要再用這個工具重新檢測一下,因為刪除重復之後還可能會出現新的重復索引,尤其是PHPCMS V9的數據庫。
二、去除不必要的索引
何為不必要的索引:我的理解是有一些字段辨識度很低的,比如abolish字段只有0和1,就沒有必要建立索引,因為使用索引和全表掃描的速度差不多甚至肯能使用索引掃描會更慢。如果實在要建立,就根據查詢情況和其他的字段建立組合索引效果會更好。
1. 為什麼要去除不必要的索引
這個理由和去除重復的索引差不多,這裡就不詳述了。
2.如何找出不必要的索引
可以通過information_schema的STATISTICS表找出類似的索引,然後再經過人工過濾,應該還有更好的辦法,呵呵。比如如下查詢,能查詢出制定庫的辨識度低的列索引:
SELECT TABLE_NAME,INDEX_NAME,COLUMN_NAME,CARDINALITY FROM `information_schema`.`STATISTICS` WHERE TABLE_SCHEMA='databasename' AND CARDINALITY<=5;
大家可以根據自己的實際情況來排查。
三、添加必須的索引
何為必須的索引:我的理解比較簡單就是會影響到查詢性能的索引就是必須的索引
1. 為什麼要添加必須的索引
必須的索引會影響到數據庫的查詢性能,很簡單又很充分的理由,呵呵!
2. 如何找出必須的索引 www.2cto.com
關於這個問題,我認為是比較有技術含量的,我的步驟如下:
A. 找出性能差或者沒有使用到索引的SQL語句
要找出性能差或者沒有使用到索引的SQL語句,需要做一些設置,比如將long_query_time設置成0.2秒左右,這個根據自己的環境來定,打開log_queries_not_using_indexes參數,可以通過set global log_queries_not_using_indexes=on;命令打開。
可以通過mysqldumpslow命令來對慢查詢日志進行統計,比如按照執行時間長短來提取或者按照執行次數來提取或者查詢記錄數來提取。列舉兩個非常常用的組合:
mysqldumpslow -s t -t 10 slow.log #找出10條消耗時間最長的慢查詢SQL
mysqldumpslow -s c -t 10 slow.log #找出10條執行次數最多的滿查詢SQ
B. 通過explain和profiling分析性能差和沒有用到索引的sql,確定需要添加的索引(也可能需要改寫對應的SQL,這個不在本文的討論范圍),關於explain和profiling的用法讀者可以自己查看相關的文檔,這裡不贅述。
作者 飛鴻無痕