MySQL數據庫查詢性能優(yōu)化的4個技巧干貨
前言
MySQL性能優(yōu)化是一個老生常談的問題,無論是在實際工作中還是面試中,都不可避免遇到相應的場景,下面博主就總結一些能夠幫助大家解決這個問題的小技巧。
SQL優(yōu)化之前需要確認哪些SQL需要優(yōu)化,這時就需要引起SQL性能分析工具,主要優(yōu)化的是查詢語句。
SQL的執(zhí)行頻率
SQL性能優(yōu)化一般是針對查詢語句,所以在定位是否需要優(yōu)化之前,可以先確認表的更刪查改的一個執(zhí)行頻率對比,如果是查詢占主導地位,則可以一步排查。
MySQL支持客戶端通過show [session|global] status命令對服務器狀態(tài)進行查詢。
查看執(zhí)行頻率方式:
show global status like ‘com_______’(7個下劃線,表示后面會有7個字符)

慢查詢日志
確認了SQL的執(zhí)行頻率,則需要通過慢查詢日志進行進一步定位哪些SQL語句執(zhí)行時間占用較長。
慢查詢日志記錄了所有執(zhí)行時間超過指定參數(long_query_time,單位:秒,默認是10s)的所有SQL語句的日志。
默認情況下,慢查詢日志是沒有開啟的,需要在MySQL的配置文件(linux下為:/etc/my.cnf)中配置如下指令:
- 查詢服務端是否開啟慢查詢日志:show variables like 'slow_query_log';
- 在mysql的配置文件中添加如下配置啟動:
- slow_query_log=1;開啟mysql慢日志查詢開關
- long_query_time=xx;設置慢日志時間,只要SQL執(zhí)行時間查過該值,則視為慢查詢,記錄在慢日志中。
- 配置完成后重啟mysql服務端
- linux中mysql的慢日志文件在: /var/lib/mysql/localhost-slow.log
window可以在my.ini文件中配置具體的地址


Query_time SQL執(zhí)行的時間,越長則越慢
Lock_time 在MySQL服務器階段(不是在存儲引擎階段)等待表鎖時間
Rows_sent 查詢返回的行數
Rows_examined 查詢檢查的行數
show profiles詳情分析
通過慢查詢日志,我們可以定位到超過設置閾值的慢SQL,但是實際業(yè)務中,這并不能完全具有代表性,因為閾值是主觀設置的,可能有大量執(zhí)行時間低于閾值的SQL也存在問題,因此慢日志SQL并不能完全定位出所有的慢SQL。
show profiles 能夠讓我們了解到SQL執(zhí)行時時間都耗費到哪里了。 通過have_profiling參數,可以查看mysql是否支持該profile操作。
格式: select @@have_profiling;

默認情況下,profiling是關閉的,可以同set指令開啟session|global級別的profiling。
格式: set global | session profiling = 1;
優(yōu)化方案:
- show profiles; 查看每一條SQL的耗時基本情況
- show profile for query query_id; 查詢指定query_id的SQL語句各個階段的耗時情況
- show profile cpu for query query_id; 查詢指定query_id的SQL語句cpu使用情況

explain執(zhí)行計劃
前面介紹的幾種方式都是通過執(zhí)行時間長短來判斷SQL語句執(zhí)行的性能好壞,但是這個相對來說是比較片面的,想要更全面地評判SQL語句好壞,則需要使用explain查看SQL的執(zhí)行計劃。
Explain或者DESC命令獲取MySQL如何執(zhí)行SELECT語句的信息,包括在SELECT語句過程中表如何連接和連接的順序。
語法:explain | desc select xxxx...
1、ID參數
select中的查詢序號,表示的是查詢中執(zhí)行select子句或者是操作表的順序(id相同,執(zhí)行順序從上往下,id不同,值越大,越先執(zhí)行)
2、select_type參數
表示select查詢類型,常見的有SIMPLE(簡單表,即不使用表連接或者子查詢)、primary(主查詢,即外層查詢)、UNION(UNION中的第二個或者后面的查詢語句)、SUBQUERY(SELECT/WHERE之后包含了子查詢)
3、type參數
表示連接/訪問類型,性能由好到差的連接類型為:null、system、const、eq_ref、ref、range、index、all
在優(yōu)化的時候,盡量將type往前優(yōu)化,最差也要為index
- null:查詢的時候不訪問任何表,如:select "1"
- system:當訪問一些系統(tǒng)表的時候會出現
- const:根據主鍵或者唯一索引訪問時,會出現const
- eq_ref:待確認
- ref:使用非唯一性索引進行訪問時,可能出現ref
- range:
- index:使用到了索引,但是對整個索引都進行了遍歷,性能也比較差
- all:全表掃描,性能最差
4、possible_key參數:顯示在執(zhí)行查詢時,表中可能被使用到的索引,一個或者多個、
5、key參數:在執(zhí)行查詢時,實際上會命中的索引
6、key_len參數:表示使用到的索引的字節(jié)數,該值為索引字段最大可能長度,在不損失精確性的前提下,長度越短越好。
7、rows參數:MySQL認為必須要執(zhí)行查詢的行數,在idb引擎表中,是一個估計值,可能并不總是準確的
8、ref參數:待確認?
9、filtered參數:表示查詢返回的行數占總讀取行數的百分比,值越大越好
10、extra參數:額外的一些執(zhí)行信息如排序
以上就是MySQL數據庫查詢性能優(yōu)化的4個技巧干貨的詳細內容,更多關于MySQL查詢性能優(yōu)化的資料請關注腳本之家其它相關文章!
相關文章
mysql 5.7.11 winx64.zip安裝配置方法圖文教程
這篇文章主要為大家分享了mysql5.7.11安裝配置方法圖文教程,具有一定的參考價值,感興趣的朋友可以參考一下2017-02-02
Mysql數據庫時間與系統(tǒng)時間不一致問題排查及解決
最近忽然發(fā)現個問題,Mysql數據庫時間與系統(tǒng)時間不一致,通過查找相關資料終于解決了,下面這篇文章主要給大家介紹了關于Mysql數據庫時間與系統(tǒng)時間不一致問題排查及解決的相關資料,需要的朋友可以參考下2023-06-06

