mysql優化一之查詢優化

来源:https://www.cnblogs.com/huanglf714/archive/2019/04/22/10750779.html
-Advertisement-
Play Games

這一篇筆記的mysql優化是註重於查詢優化,根據mysql的執行情況,判斷mysql什麼時候需要優化,關於資料庫開始階段的資料庫邏輯、物理結構的設計結構優化不是本文重點,下次再談 查看mysql語句的執行情況,判斷是否需要進行優化 以下分別通過java程式員可分析的前三個方面來討論mysql語句的查 ...


這一篇筆記的mysql優化是註重於查詢優化,根據mysql的執行情況,判斷mysql什麼時候需要優化,關於資料庫開始階段的資料庫邏輯、物理結構的設計結構優化不是本文重點,下次再談
查看mysql語句的執行情況,判斷是否需要進行優化

當感覺操作資料庫查詢語句速度變慢,不符合生產效率要求時,可按照以下步驟進行查看
1、 慢查詢的開啟與捕獲,查看可能是哪些SQL語句造成的查詢速度慢
2、 explain+SQL語句
3、 show profile分析SQL語句在伺服器內執行細節和生命周期情況
4、 通過以上三個步驟大致確定問題SQL之後,可聯繫運維人員或者DBA進行資料庫伺服器參數的調整優化

以下分別通過java程式員可分析的前三個方面來討論mysql語句的查詢優化

一、慢查詢

慢查詢日誌是mysql的一個日誌記錄,可以用來記錄mysql語句執行時間超過指定的long_query_time的SQL語句,long_query_time的預設值是10s
慢查詢日誌預設情況下是不開啟的,因為將數據保存到日誌會對性能有一定影響,測試環境下可手動打開,但註意手動開啟之後只對本次啟動生效,mysql關閉之後重啟恢復預設狀態,要想持久生效要改變my.ini配置文件(Window系統下),其他系統變數也如此

可通過show varaibles like '%slow_query_log%'來查看日誌開啟情況

可以用set long_query_time = 3;語句來改變預設的閥值,然後我們可以用show varaiables like 'long_query_
time'來查看是否更改生效,若沒有生效,可嘗試重啟一下mysql客戶端即可

然後我們現在來測試一下,因為我們平時個人測試學習的資料庫及其簡單的SQL語句可能沒有造成很慢的查詢,我們可以採用 select sleep(time)來模擬測試
(這個函數類似於java線程中的sleep函數)

執行該函數之前slow.log文件:

執行sleep(4)函數,因為要讓你設置的這個time大於記錄到日誌裡面的時間閥值

可已看到這條慢查詢話費的具體時間是4.041230,也可以看到是哪個用戶在哪個資料庫操作的哪條具體SQL語句,我們開啟慢查詢日誌的目的就是找到這樣的造成查速度減慢的SQL語句,為第二步的explain提供基礎

mysqldumpslow日誌分析工具

在實際的資料庫使用過程中可能會有多條日誌記錄,數據複雜,人工分析費事費力,mysql提供了一個日誌分析工具mysqldumpslow
可以根據你設定的參數查詢出滿足條件的日誌記錄,方便查看

可用的參數有
-s, 是表示按照何種方式排序
    排序方式有
        c: 訪問計數
        l: 鎖定時間

        r: 返回記錄

        t: 查詢時間

        al:平均鎖定時間

        ar:平均返回記錄數

        at:平均查詢時間
-t, 是top n的意思,即為返回前面多少條的數據;

-g, 後邊可以寫一個正則匹配模式,大小寫不敏感的;

示例
得到返回記錄集最多的10個SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到訪問次數最多的10個SQL

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照時間排序的前10條裡面含有左連接的查詢語句。

mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

另外建議在使用這些命令時結合 | 和more 使用 ,否則有可能出現刷屏的情況。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

二、explain+SQL語句

執行這個語句可以讓開發人員看到select語句執行的詳細信息,開發人員可以將上一步慢查詢中捕獲的慢查詢SQL語句進行分析,判斷查詢效率低的可能原因
可以幫助選擇更好的索引和寫出優化的查詢語句

使用explain我們可以得到以下信息
表的讀取順序
數據讀取操作的類型
哪些索引可以使用
哪些索引實際被使用
表之間的引用
每張表有多少行被優化器掃描

示例

我們來逐個分析各欄位
id:select查詢的序列號,代表的是select執行的順序,主要有以下三種情況

id相同時,則按照從上到下依次執行  


id不同時,id值越大優先順序越高,越先被執行  


id有相同有不同,則相同的id為一個組,不同組的id值按照規則二的優先順序執行,同組id則按照規則一依次執行  

select_type:select查詢的類型,有以下常用幾種

simple:表示該查詢沒有子查詢和UNION連接查詢  
primary:有子查詢時的最外層查詢  
subquery:有子查詢時的內層嵌套查詢  
derived:在from中包含的select就稱為derived(衍生)  ,mysql會遞歸這些子查詢,把結果放在臨時表中  
union:union的第二個或者最後一個  
union result:union的結果  

table:執行當前SQL語句用到的表

partitions:代表當前表所使用的分區

type:顯示使用了何種查詢,按照常見的幾種查詢最好到最壞排序為system>const>eq_ref>ref>range>index>all

system,const:mysql能夠對這部分進行查詢優化使能夠將其轉換成一個常量(system只返回一行,const有多行),如某一行的主鍵放入WHERE子句里的方式來選取此行的主鍵,MySQL就能將這個查詢轉換成一個常量。然後就可以高效的將表從聯接執行中移除  
eq_ref:使用該索引查找,mysql知道最多返回一條數據,可以在使用主鍵或者唯一性索引查找時用到  
ref:非唯一性索引的索引查找  
range:範圍掃描,例如帶有between或者>,<,in等  
index:掃描所有索引行  
all:掃描所有數據行  

possible_keys/kesy:代表可能用到的索引和實際用到的索引

key_len:在索引中使用的位元組數

ref:顯示了之前的表在key列記錄的索引中查找值所用的列或常量

rows:mysq估計的要找到滿足條件的行所需要掃描的行數

filtered:給出了一個百分比的值,這個百分比的值和rows列的值一起使用,可以估計出那些將要和QEP中的前一個表進行連接的行的數目。前一個表就是指id列的值比當前表的id小的表

extra:給出一些額外但重要的信息,常見重要的信息有

    using index:使用了覆蓋索引,以避免掃描表(良好情況)  
    using filesort:索引創建數據排序方式不滿足要求,mysql在外部重新排序(嚴重,需要優化)  
    using temporary:mysql創建使用了臨時表來保存信息(嚴重,需要優化) 
    using where:使用了where  
    using join buffer:在獲取連接條件時沒有使用索引,並且需要連接緩衝區來存儲中間結果(需要增加索引進行優化)  

這個裡面我們需要重點關註的屬性是type,keys,row,extra來判斷是否為一個良好的查詢
更多慄子及分析見下一篇文章索引詳解

三、show profile

show profile是mysql用來分析SQL查詢語句的資源使用情況的工具

使用方法:

1、 因為mysql這個功能預設是關閉的,所以先查看一下並開啟



(與開啟慢查詢日誌類似,可能需要重啟mysql客戶端才能生效)

2、 我們執行一些測試的SQL語句之後運行show profiles語句

3、 我們可以選擇指定項指定SQL語句來分析


一般我們查看的屬性就是cpu和block io兩個模塊

註意:

若出現以下任意一個情況,都表示這是一個糟糕的SQL語句,需要優化
1、 convering heap to MyIsam查詢結果過大,記憶體不夠,需要記錄到磁碟上
2、 creating tmp table創建臨時表儲存數據,用完之後刪除
3、 copying to tmp table on disk將臨時表中的數據儲存到磁碟上
4、 locked


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Redis的數據結構類型,指的是redis的值的value類型; Redis的常用數據結構類型:string,list,set,sortedSet,hash 一.sting的類型 string類型是redis最常見的數據結構類型,存儲的值為字元串。 1.1String相關命令 set key val ...
  • Shell 腳本中經常需要用到一些括弧、引號表達式,功能各不相同,本文詳細介紹一下。 1、雙引號 " " 雙引號常用於包含一組字元串,在雙引號中,除了 "$"、"\"、" ` (反引號)"有特殊含義外,其餘字元(如IFS、換行符、回車符等)沒有特殊含義。 輸出結果為 3,在雙引號中 $ 符仍有特殊含 ...
  • 直入主題: 我們做一個操作,將員工SCOTT的部門去掉,再次通過內連接查看數據,看看會產生什麼現象? 使用內連接,查詢數據 問題:找不到SCOTT員工了,只有13條數據,這顯然不合理;這就是內連接的缺點 -- 內連接:只顯示匹配的數據-- 外連接:顯示匹配的數據,還顯示(部分或者全部)不匹配的數據, ...
  • 本文章目的:力求清晰明瞭講解SQL語句的內連接的各種應用,沒有深奧的理解! 前奏:這篇文章和下篇文章會將內連接和外連接講解清楚SQL語句的多表查詢常用的有以下幾種:兩表聯合查詢(1)內連接(2)外連接(分左外連接、右外連接)(3)全外連接(4)自連接三表查詢(1)三表查詢本片講解兩表聯合查詢的內連接 ...
  • mysql語法中case when then與列轉行的使用場景非常豐富。 case語句類似java中條件分支語句的作用,可以類比java中的switch語句或者if語句來學習。 其語法如下: case語句的語法: 轉換單個欄位時: case 欄位 when 欄位值 then 返回值 when 欄位值 ...
  • JDBC(Java DataBase Connector) :定義了一系列的介面用於資料庫的操作 要掌握的介面: java.sql.Driver : -->驅動 java.sql.Connection -->連接 java.sql.Statement -->靜態處理塊 java.sql.Prepar ...
  • 更新緩存的時候涉及兩個問題: 刪除(del)還是 修改(set)? 先操作資料庫,還是 先操作緩存? 組合起來就有四種情況: 第一種情況:先刪除緩存,後更新資料庫 如果刪除緩存失敗,則後面的操作都不會執行,沒問題; 如果刪除緩存成功,更新資料庫失敗,則緩存與資料庫不一致,但這種不一致會馬上被修正, ...
  • SQL操作符 算術操作符:+加, 減, 乘,/除 比較操作符: ,=,!=,,= 常用的判斷,和!=相同 between $lower_val$ and $hight_val$ between .. and.. 包括兩端 查詢20 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...