1. 如何發現有問題的SQL? 使用mysql慢查詢日誌對有效率問題的Sql進行監視mysql
(1) show variables like 'slow_query_log'; 查看慢查詢日誌是否開啓sql
(2) set global slow_qeury_log_file = '/home/mysql/sql_log/mysql_slow.log' 設置慢查詢日誌文件的位置工具
(3) set global log_queries_not_using_indexes = on 把沒有使用索引的SQL存入慢查詢日誌優化
(4) set global long_query_time = 1 設置時間限制,即超過這個時間的SQL就記錄到日誌中spa
這裏能夠使用查看變量的方式,查看上面參數的默認值 好比:show variables like 'slow%' 能夠看到慢查詢日誌的默認存放位置3d
2. 慢查詢日誌包含的內容日誌
3. 經常使用的慢查詢日誌分析工具
blog
(1) mysqldumpslow 工具(通常在安裝mysql時就已經有了) 用法: mysqldumpslow + 參數 + 慢查詢日誌文件路徑索引
經常使用參數:ip
-t 數字: 顯示前n條日誌 能夠使用mysqldumpslow -h 查看全部可攜帶的參數
(2) pt-query-digest 工具
使用這個工具分析慢查詢日誌時的輸出 共有三部分:
第一部分:顯示日誌的時間範圍,總的SQL數量和不一樣的SQL數量
第二部分:
第三部分:顯示具體的SQL語句
4.根據日誌中的指標發現有問題的SQL
(1) 查詢次數多且每次查詢佔用時間長的SQL 一般爲pt-query-digest分析的前幾個查詢
(2) IO大的SQL 注意pt-query-digest 分析中的Rows examine (即掃描的行數)項
(3) 未命中索引的SQL 注意pt-query-digest 分析中Rows examine 和 Rows Send 的對比
5. 有問題的SQL被發現後,使用explain從句查詢SQL的執行計劃,explain返回的是一個表格,下面是各列的含義:
const: 一般是對主鍵或惟一索引的查找
eq_reg: 範圍查找
ref: 鏈接查找,基於索引
range: 基於索引範圍查找
index: 對索引的掃描
ALL: 對整個表的掃描
5. 優化子查詢
儘可能使用連表查詢代替子查詢
當有重複數據時,能夠使用distinct進行去重。
6. 優化limit查詢
(1) 優化方案:使用有索引的列或主鍵進行order by 操做
(2) 優化方案:記錄上次返回的主鍵,在下次查詢時使用主鍵過濾(方向就是避免掃描過多的記錄)
select film_id, description from film where film_id > 55 and film_id <= 60 order by film_id limit 1,5