優化SQL 經典案例!!!(上)

hell,大家早上好、中午好、晚上好、歡迎收看本次文章,我是聲音甜美的雞排妹。今天是週日,我今天去了廣州圖書館這邊寫文章。分享一下雞排妹在工作中遇到SQL優化的經驗。


優化SQL 經典案例!!!(上)

在應用的的開發過程中,由於初期數據量小,開發人員寫 SQL 語句時更重視功能上的實現,但是當應用系統正式 上線後,隨著生產數據量的急劇增長,很多 SQL 語句開始逐漸顯露出性能問題,對生產的影響也越來越大,此時 這些有問題的 SQL 語句就成為整個系統性能的瓶頸,因此我們必須要對它們進行優化,本章將詳細介紹在 MySQL 中優化 SQL 語句的方法。當面對一個有 SQL 性能問題的數據庫時,我們應該從何處入手來進行系統的分析,使得能夠儘快定位問題 SQL 並 儘快解決問題。


3.1 查看SQL執行頻率

MySQL 客戶端連接成功後,通過 show [session|global] status 命令可以提供服務器狀態信息。show [session|global] status 可以根據需要加上參數“session”或者“global”來顯示 session 級(當前連接)的計結果和 global 級(自數據庫上次啟動至今)的統計結果。如果不寫,默認使用參數是“session”。

下面的命令顯示了當前 session 中所有統計參數的值:

show status like 'Com_______';

優化SQL 經典案例!!!(上)

show status like 'Innodb_rows_%';


優化SQL 經典案例!!!(上)

Com_xxx 表示每個 xxx 語句執行的次數,我們通常比較關心的是以下幾個統計參數。

優化SQL 經典案例!!!(上)

show status like 'Com_______';

show status like 'Innodb_rows_%';

Com_*** : 這些參數對於所有存儲引擎的表操作都會進行累計。

Innodb_*** : 這幾個參數只是針對InnoDB 存儲引擎的,累加的算法也略有不同。


3.2 定位低效率執行SQL

  • 慢查詢日誌 : 通過慢查詢日誌定位那些執行效率較低的 SQL 語句,用--log-slow-queries[=file_name]選項啟 動時,mysqld 寫一個包含所有執行時間超過 long_query_time 秒的 SQL 語句的日誌文件。具體可以查看本 書第 26 章中日誌管理的相關部分。
  • show processlist : 慢查詢日誌在查詢結束以後才紀錄,所以在應用反映執行效率出現問題的時候查詢慢查詢 日誌並不能定位問題,可以使用show processlist命令查看當前MySQL在進行的線程,包括線程的狀態、是否 鎖表等,可以實時地查看 SQL 的執行情況,同時對一些鎖表操作進行優化。
優化SQL 經典案例!!!(上)

  1. id列,用戶登錄mysql時,系統分配的"connection_id",可以使用函數connection_id()查看
  2. user列,顯示當前用戶。如果不是root,這個命令就只顯示用戶權限範圍的sql語句
  3. host列,顯示這個語句是從哪個ip的哪個端口上發的,可以用來跟蹤出現問題語句的用戶
  4. db列,顯示這個進程目前連接的是哪個數據庫
  5. command列,顯示當前連接的執行的命令,一般取值為休眠(sleep),查詢(query),連(connect)等
  6. time列,顯示這個狀態持續的時間,單位是秒
  7. state列,顯示使用當前連接的sql語句的狀態,很重要的列。state描述的是語句執行中的某一個狀態。一 個sql語句,以查詢為例,可能需要經過copying to tmp table、sorting result、sending data等狀態 才可以完成
  8. info列,顯示這個sql語句,是判斷問題語句的一個重要依據

3.3 explain分析執行計劃

通過以上步驟查詢到效率低低SQL語句後,可以通過EXPLANIN或者DESC命令獲取MySQL命令獲取MySQl如果執行SELECT語句的信息,包括在SELECT 語句執行過程中如何連接和連接順序。

explain select * from tb_item where id = 536563;

優化SQL 經典案例!!!(上)

explain select * from tb_item where title ='new2 - 阿爾卡特 (OT-927) 炭黑 聯通3G手機 雙卡雙待';

優化SQL 經典案例!!!(上)


分享到:


相關文章: