# 定位低效率執行SQL
可以通過以下兩種方式定位執行效率較低的 SQL 語句。
##慢Sql日志
- 慢查詢日志 : 通過慢查詢日志定位那些執行效率較低的 SQL 語句,用--log-slow-queries[=file_name]選項啟動時,mysqld 寫一個包含所有執行時間超過 long_query_time 秒的 SQL 語句的日志文件。具體可以查看本書第 26 章中日志管理的相關部分。
- show processlist : 慢查詢日志在查詢結束以后才紀錄,所以在應用反映執行效率出現問題的時候查詢慢查詢日志并不能定位問題,可以使用show processlist命令查看當前MySQL在進行的線程,包括線程的狀態、是否鎖表等,可以實時地查看 SQL 的執行情況,同時對一些鎖表操作進行優化。
~~~
mysql> show processlist\G;
*************************** 1. row ***************************
Id: 4
User: event_scheduler
Host: localhost
db: NULL
Command: Daemon
Time: 438290
State: Waiting on empty queue
Info: NULL
*************************** 2. row ***************************
Id: 10
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: starting
Info: show processlist
2 rows in set (0.01 sec)
ERROR:
No query specified
~~~
```
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語句,是判斷問題語句的一個重要依據
```
- 鳴謝
- 安裝和配置
- Mac 安裝MySql 8
- 授權用戶遠程登錄
- MySql 命令加入系統命令
- 啟動Mysql
- 索引
- 索引介紹與優勢
- 索引結構
- 索引操作語法
- 索引設計原則
- 存儲引擎
- MySql的體系解構
- 存儲引擎
- 各種存儲引擎特性
- 存儲引擎的選擇
- 優化SQL
- 查看SQL執行效率
- 定為低效率執行SQL
- explain分析執行計劃
- show profile分析SQL
- tract 分析優化器執行計劃
- 索引的使用
- 驗證索引可以提高查詢效率
- 索引使用
- 查看索引的使用情況
- SQL優化
- 大批量插入數據
- 優化insert語句
- 優化order by語句
- 優化group by的優化
- 優化嵌套索引
- 優化OR條件
- 優化分頁查詢
- 使用SQL提示