mysql數據庫優化 SQL語句優化

Mysql數據庫優化——sql語句優化
參考:http://www.imooc.com/learn/194mysql

學些慕課網視屏總結
sql


1、如何發現有問題的sql?
一、使用mysql慢查詢日誌對有效率問題的sql進行監控

//查看是否開啓慢查詢日誌
show variables like 'slow_query_log'數據庫

wKiom1cIi-LjBzUoAAAsFHJ28Wo191.png

set global slow_query_log =on;//開啓慢查詢vim


//設置保存慢查詢日誌路徑
set global slow_query_log_file = '/var/lib/mysql/slow_log.log';微信

//記錄下沒有使用索引的query,
show variables like 'log_queries_not_using_indexes' //先查看是否開啓
set global log_queries_not_using_indexes = on;
ide

//設置sql執行時間
show variables like 'long_query_time';
set global long_query_time =1; //有點bug(修改了,在當前會話查詢發現好像沒有修改同樣,不過退出後再登陸mysql發現已經修改了)工具


以上設置了慢查詢經常使用參數測試


接下來測試一下優化

運行一條sql語句
spa

select sleep(5);


vim /var/lib/mysql/slow-low.log

wKioL1cIjEWCXAllAABi5sosyvE046.png

二、慢查詢日誌分析工具
mysqldumpslow:直接同mysql數據庫一同安裝

//查詢下相關使用參數

mysqldump -h

wKiom1cI9EXQcyTOAACyhV5X_mU212.png

//直接分些下慢查詢日誌

mysqldumpslow -t 3 /var/lib/mysql/mysql-slow.log

wKioL1cI9Z3TsiQfAAEYMnTjA4w321.png


pt_query_digest


三、如歌經過慢查詢日誌發現有問題的sql?
(1)查詢次數多且每次查詢佔用時間長的sql
(2)IO大的sql
(3)未命中索引的sql


2、使用explain查詢SQL的執行計劃
explain返回各列的含義
table:顯示這一行的數據是關於哪張表的;
type:顯示鏈接使用了何種類型;從最好到最差的鏈接類型爲const、eq_reg、ref、range、index、all
possible_keys:顯示可能應用在這種表的索引;若是爲空,沒有可能的索引;
key:實際使用的索引,若是爲NULL,則沒有使用索引;
key_len:使用索引的長度,在不損失精確性的狀況下,長度越短越好;
ref:顯示索引的哪一列被使用了,若是可能的話,是一個常數
rows:mysql認爲必須檢查的用來返回請求數據的行數

extra:using filesort(mysql須要進行格外的步驟來發現如何對返回的行排序)/using temporary(mysql建立一個臨時表來存儲結果)(看到這兩個的時候語句就須要優化了)


3、索引優化

如何選擇合適的列創建索引?
一、在where從句,group by從句,order by 從句,on從句中出現的列
二、索引字段越小越好
三、離散度大的列放到聯合索引的前面
離散度:一列值重複度的大小

覆蓋索引:一個索引包含了查詢的全部列稱爲覆蓋索引


索引的維護及優化---重複及冗餘索引
重複索引:指相同的列一相同的順序創建的同類型索引;例如一張表的主鍵又創建unique()惟一性索引就屬於重複索引
冗餘索引:指多個索引的前綴列相同,或是在聯合索引中包含了主鍵索引


pt-duplicate-key-checker:工具能夠查看數據庫中多餘的索引

相關文章
相關標籤/搜索