11、定位SQL執行慢

1、數據庫服務器的優化步驟

S觀察(Show status)和A行動(Action)mysql

  1. 是否存在週期性的波動,加緩存,或者更改緩存失效策略
  2. 開啓慢查詢,定位執行慢的 SQL 語句
  3. 用 EXPLAIN 查看對應 SQL 語句的執行計劃,或者使用 SHOW PROFILE 查看 SQL 中每個步驟的時間成本
  4. SQL 等待時間長,能夠調優服務器的參數,好比適當增長數據庫緩衝池
  5. SQL 執行時間長,索引設計的問題、查詢關聯的數據表過多、數據表的字段設計問題致使了這一現象
  6. 增長服務器,採用讀寫分離的架構,或者考慮對數據庫分庫分表,好比垂直分庫、垂直分表和水平分表

2、使用慢查詢定位執行慢的 SQL

show variables like '%slow_query_log'; -- 查看慢查詢日誌設置
set global slow_query_log='ON'; -- 開啓慢查詢日誌
show variables like '%long_query_time%'; -- 查看慢查詢的時間閾值設置
set global long_query_time = 3; -- 設置慢查詢時間閾值(秒)

使用 MySQL 自帶的 mysqldumpslow 工具統計慢查詢日誌正則表達式

  • -s:採用 order 排序的方式,分別是 c(訪問次數)、t(查詢時間)、l(鎖定時間)、r(返回記錄)、ac(平均查詢次數)、al(平均鎖定時間)、ar(平均返回記錄數)和 at(平均查詢時間,默認排序
  • -t:返回前 N 條數據 。
  • -g:後面能夠是正則表達式,對大小寫不敏感

3、使用 EXPLAIN 查看執行計劃

EXPLAIN SELECT 字段 FROM 表 WHERE 條件

  • all 是最壞的狀況,由於採用了全表掃描的方式
  • index 和 all 差很少,只不過 index 對索引表進行全掃描,這樣作的好處是再也不須要對數據進行排序,可是開銷依然很大
  • 若是咱們在 Extral 列中看到 Using index,說明採用了索引覆蓋,也就是索引能夠覆蓋所需的 SELECT 字段,就不須要進行回表,這樣就減小了數據查找的開銷

4、使用 SHOW PROFILE 查看 SQL 的具體執行成本

show variables like 'profiling'; -- 查看SQL 的執行成本設置
set profiling = 'ON'; -- 開啓SQL 的執行成本設置
show profiles; -- 當前會話都有哪些 profiles
show profile; -- 查看上一個查詢的開銷
相關文章
相關標籤/搜索