[MySql 如何分析性能] Sql性能分析 sql語句: "show global status like "Comlxx____";" 結果: + + + | Variable_name | Value | + + + | Com_binlog | 0 | | Com_commit | 7 | ...
[MySql 如何分析性能]
Sql性能分析
sql語句:
"show global status like "Com_______";"
結果:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_binlog | 0 |
| Com_commit | 7 |
| Com_delete | 2 |
| Com_insert | 10 |
| Com_repair | 0 |
| Com_revoke | 0 |
| Com_select | 1400 |
| Com_signal | 0 |
| Com_update | 2 |
| Com_xa_end | 0 |
+---------------+-------+
即: 當前資料庫查詢了1400次數,插入了1條數據,刪除了2條,更新了條;
針對資料庫優化 我們只需要關註查詢次數即可,因為我們操作最多的也就是查詢;
-
慢查詢日誌
慢查詢日誌記錄了所有執行時間超過指定參數(long_query_time,單位:秒,預設10秒)的所有SQL語句的日誌。
MySQL的慢查詢日誌預設沒有開啟,需要在MySQL的配置文件(/etc/my,cnf)中配置如下信息:
SQL語句: show variables like 'slow_query_log'; 結果: +----------------+-------+ | Variable_name | Value | +----------------+-------+ | slow_query_log | OFF | +----------------+-------+ 1 row in set (0.00 sec) # 我們可以看到日誌預設為 關閉狀態! 如需開啟 修改配置文件(/etc/my,cnf)
修改配置文件
#開啟MySQL慢日誌查詢開關 show_query_log=1 #設置慢日誌的時間為2秒,SQL語句執行超過2s即為慢查詢,然後就會記錄慢查詢日誌 long_query_time=2 "“” 配置文件中加入如上參數即可! "“” 註意!!! # 修改完配置文件需要重啟MySQL服務!
-
profile詳情
- show profiles 能夠在做SQL優化時幫助我們瞭解時間都耗費到哪個地方。通過have_profiling參數,能夠看到當前MySQL是否支持profile操作:
執行SQL語句查看是否支持profiling select @@have_profiling; # 結果: +------------------+ | @@have_profiling | +------------------+ | YES | +------------------+ # 可以看到我們當前資料庫是支持profile操作的
- 預設profiling是關閉的,可以通過set語句在session/global級別開啟profiling:
(session/global 代表 當前會話/全局)
# 1。查看是否開啟profiling select @@profiling; 結果: +-------------+ | @@profiling | +-------------+ | 0 | +-------------+ # 2.開啟profiling set profiling=1;
執行一系列的業務SQL的操作,然後我們可以通過如下指令查看SQL的執行耗時
# 查看每一條SQL的耗時基本情況 show profiles; # 查看指定query_id的SQL語句各個階段的耗時情況 show profile for query query_id; # 查看指定query_id的SQL語句CPU的使用情況 show profile cpu for query query_id; 註意: query_id 為日誌中記錄的id號 可通過第一條指令看到!
-
explain執行計劃
explain 或者 desc命令獲取MySQL如何執行select語句的信息,包括在select語句執行過程中表如何連接和連接的順序。
語法:
# 直接在select語句之前加上關鍵字explain/desc explain select 欄位列表 from 表名 where 條件; # 例如:explain select name from t1 where id=1; # 結果: +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 33.33 | Using where | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ # explain 執行計劃中各欄位的含義 1、id select查詢的序列號,表示查詢中執行select的子句或者是操作表的順序(id相同,執行順序從上到下;id不同。值越大越先執行!)。 2、select_type 表示select的類型,常見的取值有: simple(簡單表,即不使用表連接或者子查詢)、 primary (主查詢,即外層的查詢)、 union (union中的第二個或者後面的查詢語句)、 subquery (select/where之後包含子查詢)等 3、type 表示連接類型,性能由好到差的連接類型為NULL、system、const、eq_ref、ref、range、index、all。 4、possible_key 顯示可能應用在這張表上的索引、一個或者多個。 5、key 實際使用的索引,如果為NULL、則沒有使用索引。 6、key_len 表示索引中使用的位元組數,該值為索引欄位最大可能長度,並非實際使用長度、在不損失精確性的前提下、長度越短越好。 8、rows mysql認為必須要執行查詢的行數,在innodb引擎的表中,是一個估計值,可能是並不總是準確的。 9、filtered 表示返回結果的行數占需要讀取行數的百分比,filtered的值越大越好。 10、extra 代表前邊欄位中的值沒有展示出來的信息會在這個地方展示! # 重點關註:type、possible_key、key、key_len # 參考欄位:rows、extra