1、EXPALINmysql
在SQL語句以前加上EXPLAIN關鍵字就能夠獲取這條SQL語句執行的計劃sql
那麼返回的這些字段是什麼呢?性能
咱們先關心一下比較重要的幾個字段:spa
1. select_type 查詢類型日誌
1)simple 簡單查詢,沒有UNION和子查詢code
2)priamry 主查詢,有UNION或子查詢的最外層查詢server
3)union 聯合查詢,有UNION的第二個和之後的查詢blog
4)subquery 子查詢,有子查詢的除FROM包含的子查詢索引
5)derived 派生查詢,FROM包含的子查詢進程
6)dependent union, dependent subquery 受到外部表查詢影響的union和subquery
2.type 查詢方式
依次從好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL
ps: 除了all以外,其餘的type均可以使用到索引,除了index_merge以外,其餘的type只能夠用到一個索引
1)system 只有一行數據或者是空表,且引擎是myisam
2)const 常量 WHERE使用惟一索引(主鍵id,或者其餘UNIQUE索引字段)搜索
3)eq_ref
4)ref 常見於輔助索引的等值查找
5)fulltext 全文索引檢索
6)ref_or_null 與ref方法相似,只是增長了null值的比較
7)unique_subquery 用於where中的in形式子查詢,子查詢返回不重複值惟一值
8)index_subquery 用於where中的iin形式子查詢,使用到了輔助索引或者in常數列表,子查詢可能返回重複值
9)range 索引範圍掃描,常見於使用>,<,is null,between ,in ,like等運算符的查詢中
10)index_merge 使用了兩個以上的索引,最後取交集或者並集
11)index 遍歷索引樹
12)ALL 全表數據掃描
3. extra 額外訊息
4. 其餘
1)possible key 這次查詢中可能選用的索引,一個或多個
2)key 查詢真正使用到的索引
3)key_len 索引長度(用到的索引字段的長度相加,例如用到 id int(8) + age int(5) 索引長度爲8+5+2=15,加2是固定額外要加的)
4)rows 估算的掃描行數
5)filtered 存儲引擎返回的數據在server層過濾後,剩下多少知足查詢的記錄數量的百分比
2、mysql慢查詢日誌
1.找到mysql配置文件(通常在mysql安裝目錄下)
Windows爲my.ini,Linux爲my.cnf
[mysqld] slow_query_log = ON slow_query_log_file = '自定義路徑' long_query_time = 1
slow_query_log:是否開啓慢查詢日誌
slow_query_log_file:慢查詢日誌的位置
long_query_time:慢查詢的標準(秒)
2.重啓mysql守護進程/服務,查看是否生效
SHOW VARIABLES LIKE '%slow_query%'; SHOW VARIABLES LIKE '%long_query%';
3.嘗試慢查詢
SELECT SLEEP(3);
3、Profile 會話級別的性能分析
1.只能在當前會話使用
SET profiling = 1;
2.隨便輸入幾句SQL查詢語句
SELECT * FROM house; SELECT sleep(1); SELECT sleep(3);
3. show profiles
4. show profile( 默認顯示最近一次查詢 select sleep(3) 詳細性能報告)
5. show profile for query 2(查詢Query_ID爲2的查詢 select sleep(1) 詳細性能報告)