[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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552896.html
標籤:其他
上一篇:MongoDB + SpringBoot 的基礎CRUD、聚合查詢
下一篇:返回列表
