MySQL性能優化

1、優化思路mysql

  數據查詢慢,不表明 SQL 語句寫法有問題。 首先,咱們須要找到問題的源頭才能「對症下藥」。用一張流程圖展現 MySQL 優化的思路:正則表達式

     從圖中能夠清楚地看出,致使數據查詢慢的緣由有多種,如:緩存失效,在此一段時間內因爲高併發訪問致使 MySQL 服務器崩潰;SQL 語句編寫問題;MySQL 服務器參數問題;硬件配置限制 MySQL 服務性能問題等。sql

2、查看 MySQL 服務器運行的狀態值vim

    若是系統的併發請求數不高,且查詢速度慢,能夠忽略該步驟直接進行 SQL 語句調優步驟。執行命令:緩存

show status

   因爲返回結果太多,此處不貼出結果。其中,再返回的結果中,咱們主要關注 「Queries」、「Threads_connected」 和 「Threads_running」 的值,即查詢次數、線程鏈接數和線程運行數。bash

  咱們能夠經過執行以下腳本監控 MySQL 服務器運行的狀態值:服務器

#!/bin/bash
while true
do
mysqladmin -uroot -p"密碼" ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}' >> status.txt
sleep 1
done

  執行該腳本 24 小時,獲取 status.txt 裏的內容,再次經過 awk 計算:每秒請求 MySQL 服務的次數併發

awk '{q=$1-last;last=$1}{printf("%d %d %d\n",q,$2,$3)}'>> status.txt

  若是觀察的數據有周期性的變化,須要修改緩存失效策略。socket

3、獲取須要優化的SQL語句高併發

   方式一:查看運行的線程

   執行命令:

show processlist

  返回結果:

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info          
+----+------+-----------+------+---------+------+----------+------------------+
|  9 | root | localhost | test | Query   |    0 | starting | show processlist 
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)

 從返回結果中咱們能夠了解該線程執行了什麼命令/SQL 語句以及執行的時間。實際應用中,查詢的返回結果會有 N 條記錄。其中,返回的 State 的值是咱們判斷性能好壞的關鍵,其值出現以下內容,則該行記錄的 SQL 語句須要優化:

Converting HEAP to MyISAM # 查詢結果太大時,把結果放到磁盤,嚴重
Create tmp table #建立臨時表,嚴重
Copying to tmp table on disk  #把內存臨時表複製到磁盤,嚴重
locked #被其餘查詢鎖住,嚴重
loggin slow query #記錄慢查詢
Sorting result #排序

   方式二:開啓慢查詢日誌

   在配置文件 my.cnf 中的 [mysqld] 一行下邊添加兩個參數:

slow_query_log = 1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time = 2

log_queries_not_using_indexes = 1

 其中,slow_query_log = 1 表示開啓慢查詢;

              slow_query_log_file 表示慢查詢日誌存放的位置;

              long_query_time = 2 表示查詢 >=2 秒才記錄日誌;

              log_queries_not_using_indexes = 1 記錄沒有使用索引的 SQL 語句。

  注意:slow_query_log_file 的路徑不能隨便寫,不然 MySQL 服務器可能沒有權限將日誌文件寫到指定的目錄中。建議直接複製上文的路徑。

 修改保存文件後,重啓 MySQL 服務。在 /var/lib/mysql/ 目錄下會建立 slow-query.log 日誌文件。鏈接 MySQL 服務端執行以下命令能夠查看配置狀況。

show variables like 'slow_query%';

show variables like 'long_query_time';

  測試慢查詢日誌:

mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

  打開慢查詢日誌文件

[root@localhost mysql]# vim /var/lib/mysql/slow-query.log
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2017-10-05T04:39:11.408964Z
# User@Host: root[root] @ localhost []  Id:     3
# Query_time: 2.001395  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use test;
SET timestamp=1507178351;
select sleep(2);

 咱們能夠看到剛纔執行了 2 秒的 SQL 語句被記錄下來了。雖然在慢查詢日誌中記錄查詢慢的 SQL 信息,可是日誌記錄的內容密集且不易查閱。所以,咱們須要經過工具將 SQL 篩選出來.

   MySQL 提供 mysqldumpslow 工具對日誌進行分析。咱們可使用 mysqldumpslow --help 查看命令相關用法

   經常使用參數以下:

-s:排序方式,後邊接着以下參數
        c:訪問次數
        l:鎖定時間
        r:返回記錄
        t:查詢時間
    al:平均鎖定時間
    ar:平均返回記錄書
    at:平均查詢時間
    -t:返回前面多少條的數據
    -g:翻遍搭配一個正則表達式,大小寫不敏感

 案例:

獲取返回記錄集最多的10個sql
mysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log

獲取訪問次數最多的10個sql
mysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log

獲取按照時間排序的前10條裏面含有左鏈接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log

  參見:http://www.javashuo.com/article/p-dxyqcgms-k.html

相關文章
相關標籤/搜索