1. 如何發現有問題的SQL? 使用mysql慢查詢日志對有效率問題的Sql進行監視
(1) show variables like 'slow_query_log'; 查看慢查詢日志是否開啟
(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就記錄到日志中
這里可以使用查看變量的方式,查看上面參數的默認值 比如:show variables like 'slow%' 可以看到慢查詢日志的默認存放位置
2. 慢查詢日志包含的內容
3. 常用的慢查詢日志分析工具
(1) mysqldumpslow 工具(一般在安裝mysql時就已經有了) 用法: mysqldumpslow + 參數 + 慢查詢日志文件路徑
常用參數:
-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