1. 程式人生 > >mysql 慢查詢

mysql 慢查詢

mysql安裝 存在 sel 位置 tween 臨時表 per 慢查詢日誌 文件中

開啟慢查詢日誌

在配置文件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 慢查詢