mysql 慢查詢
開啟慢查詢日誌
在配置文件my.cnf或my.ini中在 [mysqld] 一行下面加入兩個配置參數
slow_query_log = on #開啟慢查詢 long_query_time=1 #設置慢查詢時間 1 s slow_query_log_file="D:/phpStudy/MySQL/data/slow_query.log" #慢查詢日誌保存路徑 未指定slow_query_log_file的情況下,會自動生成一個以主機名+‘slow‘.log 的文件 log-queries-not-using-indexes = on #開啟記錄沒有使用索引查詢語句
sql 查看慢查詢配置
show status like ‘slow_queries‘; #慢查詢的次數 (默認是慢查詢時間10s) show variables like ‘long_query_time‘ ; //可以顯示當前慢查詢時間 set long_query_time=1 ; //可以修改慢查詢時間 當前會話有效,永久有效請修改配置文件
慢查詢記錄到日誌
在默認情況下,低版本的mysql不會記錄慢查詢,需要在啟動mysql時候,指定記錄慢查詢才可以
bin\mysqld.exe –log-slow-queries=D:/abc.log [低版本mysql5.0可以在my.ini指定]
該慢查詢日誌在mysql5.0這個版本中時放在 mysql安裝目錄/data/下;
針對 mysql5.5啟動慢查詢有兩種方法
① bin\mysqld.exe - -safe-mode - -slow-query-log
②在my.ini 文件中配置 [mysqld] 添加slow-query-log = on # 開啟慢查詢這個功能
可以通過 slow_query_log_file="日誌存放位置"指定目錄,默認存放在 mysql5.5.19是在my.ini 的 datadir=“目錄” ;
在mysql5.6中,默認是啟動記錄慢查詢的,my.ini其中有一個配置項 slow-query-log=1;
慢查詢sql語句explain分析
Explain sql語句;
會產生如下信息:
id: 這是SELECT的查詢序列號
select_type: 表示查詢的類型。
SIMPLE | 簡單的 select 查詢,不使用 union 及子查詢 |
PRIMARY | 最外層的 select 查詢 |
UNION | UNION 中的第二個或隨後的 select 查詢,不 依賴於外部查詢的結果集 |
DEPENDENT UNION | UNION 中的第二個或隨後的 select 查詢,依 賴於外部查詢的結果集 |
SUBQUERY | 子查詢中的第一個 select 查詢,不依賴於外 部查詢的結果集 |
DEPENDENT SUBQUERY | 子查詢中的第一個 select 查詢,依賴於外部 查詢的結果集 |
DERIVED | 用於 from 子句裏有子查詢的情況。 MySQL 會 遞歸執行這些子查詢, 把結果放在臨時表裏。 |
UNCACHEABLE SUBQUERY | 結果集不能被緩存的子查詢,必須重新為外 層查詢的每一行進行評估。 |
UNCACHEABLE UNION | UNION 中的第二個或隨後的 select 查詢,屬 於不可緩存的子查詢 |
table: 輸出結果集的表
type: 表示表的連接類型
system | 表僅有一行(=系統表)。這是 const 連接類型的一個特例。 |
const | const 用於用常數值比較 PRIMARY KEY 時。當 查詢的表僅有一行時,使用 System。 |
eq_ref | const 用於用常數值比較 PRIMARY KEY 時。當 查詢的表僅有一行時,使用 System。 |
ref | 連接不能基於關鍵字選擇單個行,可能查找 到多個符合條件的行。 叫做 ref 是因為索引要 跟某個參考值相比較。這個參考值或者是一 個常數,或者是來自一個表裏的多表查詢的 結果值。 |
ref_or_null | 如同 ref, 但是 MySQL 必須在初次查找的結果 裏找出 null 條目,然後進行二次查找。 |
index_merge | 說明索引合並優化被使用了。 |
unique_subquery | 在某些 IN 查詢中使用此種類型,而不是常規的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr) |
index_subquery | 在 某 些 IN 查 詢 中 使 用 此 種 類 型 , 與 unique_subquery 類似,但是查詢的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr) |
range | 只檢索給定範圍的行,使用一個索引來選擇 行。key 列顯示使用了哪個索引。當使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比較關鍵字列時,可 以使用 range。 |
index | 全表掃描,只是掃描表的時候按照索引次序 進行而不是行。主要優點就是避免了排序, 但是開銷仍然非常大。 |
all | 最壞的情況,從頭到尾全表掃描。 |
possible_keys: 表示查詢時,可能使用的索引
key: 表示實際使用的索引
key_len: 索引字段的長度
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數
rows: 掃描出的行數(估算的行數)
Extra: 執行情況的描述和說明
No tables :Query語句中使用FROM DUAL 或不含任何FROM子句
Using filesort :當Query中包含 ORDER BY 操作,而且無法利用索引完成排序,
Impossible WHERE noticed after reading const tables: MYSQL Query Optimizer
通過收集統計信息不可能存在結果
Using temporary:某些操作必須使用臨時表,常見 GROUP BY ; ORDER BY
Using where:不用讀取表中所有信息,僅通過索引就可以獲取所需數據;
註意:條件是一個範圍值(所謂 range),即 range 類型查詢字段後面的索引無效。
當order by 的字段在 where 條件中出現 況且 字段有固定值 或者 有固定返回時 會用到字段的索引。
慢查詢相關命令
mysql> show variables like ‘%slow%‘; +---------------------+---------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------+ | log_slow_queries | OFF | | slow_launch_time | 2 | | slow_query_log | OFF | | slow_query_log_file | D:\phpStudy\MySQL\data\Admin-slow.log | +---------------------+---------------------------------------+
mysql> show variables like ‘%long%‘; +---------------------------------------------------+-----------+ | Variable_name | Value | +---------------------------------------------------+-----------+ | long_query_time | 10.000000 | | max_long_data_size | 1048576 | | performance_schema_events_waits_history_long_size | 10000 | +---------------------------------------------------+-----------+
mysql> show variables like ‘%min%‘; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | ft_min_word_len | 4 | | min_examined_row_limit | 0 | | query_cache_min_res_unit | 4096 | +--------------------------+-------+
mysql 慢查詢