1. 程式人生 > >MySQL設定慢查詢

MySQL設定慢查詢

  MySQL的慢查詢日誌是用來記錄在MySQL中響應時間超過閥值的語句,則會被記錄到慢查詢日誌中(執行時間超過long_query_time值的SQL語句);

 

  •    慢查詢相關引數:
slow_query_log    :是否開啟慢查詢日誌,1表示開啟,0表示關閉;

log-slow-queries  :舊版(5.6以下版本)MySQL資料庫慢查詢日誌儲存路徑。可以不設定該引數,系統則會預設給一個預設的檔案host_name-slow.log;

slow-query-log-file:新版(5.6及以上版本)MySQL資料庫慢查詢日誌儲存路徑。可以不設定該引數,系統則會預設給一個預設的檔案host_name-slow.log;

long_query_time :慢查詢閾值,當查詢時間多於設定的閾值時,會將當前執行的SQL記錄到日誌中;

log_queries_not_using_indexes:未使用索引的查詢也被記錄到慢查詢日誌中(可選項);

log_output:日誌儲存方式。log_output='FILE'表示將日誌存入檔案,預設值是'FILE';
log_output='TABLE'表示將日誌存入資料庫,這樣日誌資訊就會被寫入到mysql.slow_log表中。MySQL資料庫支援同時兩種日誌儲存方式,配置的時候以逗號隔開即可,
如:log_output='FILE,TABLE'。日誌記錄到系統的專用日誌表中,要比記錄到檔案耗費更多的系統資源,因此對於需要啟用慢查詢日誌,又需要能夠獲得更高的系統性能,那麼建議優先記錄到檔案;

 

  •   日誌分析工具
    1. mysqldumpslow是mysql官方提供的perl指令碼,只要安裝有mysql的環境就可以用
      # mysqldumpslow --help
      Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
       
      Parse and summarize the MySQL slow query log. Options are
       
        --verbose    verbose
        --debug      debug
        --help       write this text to standard output
       
        -v           verbose
        -d           debug
        -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                      al: average lock time
                      ar: average rows sent
                      at: average query time
                       c: count
                       l: lock time
                       r: rows sent
                       t: query time  
        -r           reverse the sort order (largest last instead of first)
        -t NUM       just show the top n queries
        -a           don't abstract all numbers to N and strings to 'S'
        -n NUM       abstract numbers with at least n digits within names
        -g PATTERN   grep: only consider stmts that include this string
        -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
                     default is '*', i.e. match all
        -i NAME      name of server instance (if using mysql.server startup script)
        -l           don't subtract lock time from total time

       引數說明:

-s, 是表示按照何種方式排序
    c: 訪問計數
    l: 鎖定時間
    r: 返回記錄
    t: 查詢時間
    al:平均鎖定時間
    ar:平均返回記錄數
    at:平均查詢時間
-t, 是top n的意思,即為返回前面多少條的資料;
-g, 後邊可以寫一個正則匹配模式,大小寫不敏感的;

       使用例子:

得到返回記錄集最多的10個SQL
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到訪問次數最多的10個SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照時間排序的前10條裡面含有左連線的查詢語句
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

另外建議在使用這些命令時結合 | 和more 使用 ,否則有可能出現刷屏的情況;
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

       

    2.mysqlsla,是hackmysql.com推出的一款日誌分析工具,能生成資料報表, 包括執行頻率, 資料量, 查詢消耗等

    使用例子:

mysqlsla -lt slow mysql-slow.log

mysqlsla -lt slow mysql-slow.log -sf “+SELECT” -db dbName -top 10 -sort t_sum  –top=10 

    

    mysqlsla引數意義:
      lt:表示日誌型別,有slow, general, binary, msl, udl。
      sf:[+-][TYPE],[TYPE]有SELECT, CREATE, DROP, UPDATE, INSERT,例如”+SELECT,INSERT”,不出現的預設是-,即不包括。
      db:要處理哪個庫的日誌。
      top:表示取按規則排序的前多少條。
      sort:按某種規則排序,t_sum按總時間排序, c_sum按總次數排序

 

    mysqlsla輸出格式說明:

#mysqlsla輸出格式說明:
queries total: 總查詢次數,unique: 去重後的sql數量
Sorted by: 輸出報表的內容排序
Count         : sql的執行次數及佔總的slow log數量的百分比
Time          : 執行時間, 包括總時間, 平均時間, 最小, 最大時間, 時間佔到總慢sql時間的百分比
95% of Time   : 去除最快和最慢的sql, 覆蓋率佔95%的sql的執行時間
Lock Time     : 等待鎖的時間
95% of Lock   : 95%的慢sql等待鎖時間
Rows sent     : 結果行統計數量, 包括平均, 最小, 最大數量
Rows examined : 掃描的行數量
Database      : 屬於哪個資料庫
Users         : 哪個使用者,IP,佔到所有使用者執行的sql百分比
Query abstract: 抽象後的sql語句
Query sample  : sql樣例語句