SQL執行頻率
MySQL 客戶端連接成功后,通過 show [session|global] status 命令可以提供服務器狀態信
息,通過如下指令,可以查看當前資料庫的INSERT、UPDATE、DELETE、SELECT的訪問頻次:
-- session 是查看當前會話 ;
-- global 是查詢全域資料 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

假如說是以查詢為主,我們又該如何定位針對于那些查詢陳述句進行優化呢? 此時我們可以借助于慢查詢日志,
慢查詢日志
慢查詢日志記錄了所有執行時間超過指定引數(long_query_time,單位:秒,默認10秒)的所有
SQL陳述句的日志,
MySQL的慢查詢日志默認沒有開啟,我們可以查看一下系統變數 slow_query_log,

若要開啟慢查詢日志,需要在mysql組態檔(/etc/my.cnf)中配置如下資訊:
#開啟MySql慢日志查詢開關:
slow_query_log=1
#設定慢日志的時間為2s,SQL陳述句執行超過2s,就會視為慢查詢,記錄到慢查詢日志
long_query_time=2
配置完畢之后,通過以下指令重新啟動MySQL:
systemctl restart mysqld
然后,再次查看開關情況,慢查詢日志就已經打開了,

執行命令:cat /var/lib/mysql/localhost-slow.log 或者執行tail -f /var/lib/mysql/localhost-slow.log查看慢查詢日志資訊,
執行如下SQL陳述句 :select count(*) from tb_user;
檢查慢查詢日志 :最終我們發現,在慢查詢日志中,只會記錄執行時間超多我們預設時間(2s)的SQL,執行較快的SQL是不會記錄的,

通過慢查詢日志,就可以定位出執行效率比較低的SQL,從而有針對性的進行優化
profile詳情
show profiles 能夠在做SQL優化時幫助我們了解時間都耗費到哪里去了,通過have_profiling
引數,能夠看到當前MySQL是否支持profile操作:SELECT @@have_profiling ;

可以看到,當前MySQL是支持 profile操作的,但是開關是關閉的,可以通過set陳述句在
session/global級別開啟profiling:
SET profiling = 1;
開關已經打開了,接下來,我們所執行的SQL陳述句,都會被MySQL記錄,并記錄執行時間消耗到哪兒去
了, 我們直接執行如下的SQL陳述句:
select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
select count(*) from tb_sku;
執行一系列的業務SQL的操作,然后通過如下指令查看指令的執行耗時:
-- 查看每一條SQL的耗時基本情況
show profiles;
-- 查看指定query_id的SQL陳述句各個階段的耗時情況
show profile for query query_id;
-- 查看指定query_id的SQL陳述句CPU的使用情況
show profile cpu for query query_id;
查看每一條SQL的耗時情況:

查看指定SQL各個階段的耗時情況 :

explain
EXPLAIN 或者 DESC命令獲取 MySQL 如何執行 SELECT 陳述句的資訊,包括在 SELECT 陳述句執行
程序中表如何連接和連接的順序,
語法:
-- 直接在select陳述句之前加上關鍵字 explain / desc
EXPLAIN SELECT 欄位串列 FROM 表名 WHERE 條件 ;

Explain 執行計劃中各個欄位的含義:
id:select查詢的序列號,表示查詢中執行select子句或者是操作表的順序(id相同,執行順序從上到下;id不同,值越大,越先執行),
select_type:表示 SELECT 的型別,常見的取值有 SIMPLE(簡單表,即不使用表連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、
UNION(UNION 中的第二個或者后面的查詢陳述句)、
SUBQUERY(SELECT/WHERE之后包含了子查詢)等
type:表示連接型別,性能由好到差的連接型別為NULL、system、const、eq_ref、ref、range、 index、all ,
possible_key: 顯示可能應用在這張表上的索引,一個或多個,
key: 實際使用的索引,如果為NULL,則沒有使用索引,
key_len:表示索引中使用的位元組數, 該值為索引欄位最大可能長度,并非實際使用長度,在不損失精確性的前提下, 長度越短越好 ,
rows:MySQL認為必須要執行查詢的行數,在innodb引擎的表中,是一個估計值,可能并不總是準確的,
filtered: 表示回傳結果的行數占需讀取行數的百分比, filtered 的值越大越好,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/545902.html
標籤:其他
上一篇:B+Tree樹
下一篇:資料問題排查思路
