国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】

這篇具有很好參考價值的文章主要介紹了【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

性能分析

要說sql有問題,需要拿出證據(jù),因此需要性能分析

Mysql查詢優(yōu)化器(Mysql Query Optimizer)

  1. Mysql中有專門負責優(yōu)化SELECT語句的優(yōu)化器模塊,主要功能:通過計算分析系統(tǒng)中收集到的統(tǒng)計信息,為客戶端請求的Query提供他認為最優(yōu)的執(zhí)行計劃(它認為最優(yōu)的數(shù)據(jù)檢索方式,不見得是DBA認為是最優(yōu)的,這部分最耗費時間,如果知道m(xù)ysql底層是如何執(zhí)行一條sql,可以幫助我們更好地優(yōu)化sql)
  2. 當客戶端向MySQL請求一條Query,命令解析器模塊完成請求分類,區(qū)別出是 SELECT 轉發(fā)給MysQL Query Optimizer,MysQL Query Optimizer首先會對整條Query進行優(yōu)化,處理掉一些常量表達式的預算,直接換算成常量值。并對Query中的查詢條件進行簡化和轉換,如去掉一些無用或顯而易見的條件、進行結構調整。然后分析 Query 中的 Hint 信息(如果有),看顯示Hint信息是否可以完全確定該Query 的執(zhí)行計劃。如果沒有 Hint 或Hint 信息還不足以完全確定執(zhí)行計劃,則會讀取所涉及對象的統(tǒng)計信息,根據(jù) Query 進行寫相應的計算分析,然后再得出最后的執(zhí)行計劃。

Mysql常見瓶頸

  • CPU: CPU在飽和的時候一般發(fā)生在數(shù)據(jù)裝入內(nèi)存或從磁盤上讀取數(shù)據(jù)時候
  • IO:磁盤I/O瓶頸發(fā)生在裝入數(shù)據(jù)遠大于內(nèi)存容量的時候
  • 服務器硬件的性能瓶頸(機器性能本來就弱): top,free,iostat和vmstat來查看系統(tǒng)的性能狀態(tài)

EXPLAIN簡介

EXPLAIN是什么?

EXPLAIN:SQL的執(zhí)行計劃,使用EXPLAIN關鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語句,從而知道MySQL是如何處理SQL語句的,進而分析查詢語句或是表結構的性能瓶頸。

EXPLAIN怎么使用?

語法:explain關鍵字 + 所寫的SQL。

【表格形式查看】

explain select * from tbl_emp;

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【列形式查看】

mysql> explain select * from pms_category \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: pms_category
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1425
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

EXPLAIN能干嘛?

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

通過上面的表格可以查看以下信息:

id列 了解表的讀取順序

值有以下三種情況:

  • id相同,執(zhí)行順序由上至下。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • id不同,如果是子查詢,id的序號會遞增,id值越大優(yōu)先級越高,越先被執(zhí)行。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • id相同和不同 同時存在。永遠是id大的優(yōu)先級最高,id相等的時候從上到下順序執(zhí)行。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

總結:id相同上下順序走,不同id大的先走

select_type列 數(shù)據(jù)讀取操作的操作類型。

select_type:數(shù)據(jù)查詢的類型,主要是用于區(qū)別,普通查詢、聯(lián)合查詢、子查詢等復雜查詢。

【常見值】

  • SIMPLE:簡單的SELECT查詢,查詢中不包含子查詢或者UNION
  • PRIMARY:查詢中如果包含任何復雜的子部分,最外層查詢則被標記為PRIMARY。
  • SUBQUERY:在SELECT或者WHERE子句中包含了子查詢。
  • DERIVED:在FROM子句中包含的子查詢被標記為DERIVED(衍生),MySQL會遞歸執(zhí)行這些子查詢,把結果放在臨時表中。
  • UNION:如果第二個SELECT出現(xiàn)在UNION之后,則被標記為UNION;若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為DERIVED。
  • UNION RESULT:從UNION表獲取結果的SELECT。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

table列 表的名字

標題已經(jīng)通俗易懂了,哈哈

type列 訪問類型詳解及排列

【type列常見值】

  • system:一張表只有一行記錄(如系統(tǒng)參數(shù)表,每個參數(shù)字段只存儲一個值),這是const類型的特例(平時不會出現(xiàn),這個也可以忽略不計)
  • const:表示通過索引一次就找到了,const用于比較primary key或者unique索引。因為只匹配一行數(shù)據(jù),所以很快。如將主鍵置于where列表中,MySQL就能將該查詢轉化為一個常量。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • eq_ref:唯一性索引掃描,讀取本表中和關聯(lián)表表中的每行組合成的一行,查出來只有一條記錄。除了 systemconst 類型之外, 這是最好的連接類型。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • ref:非唯一性索引掃描,返回本表和關聯(lián)表某個值匹配的所有行,查出來有多條記錄。

【例子1】

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【例子2】

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • range:只檢索給定范圍的行,一般就是在WHERE語句中出現(xiàn)了BETWEEN、< >、in等的查詢。這種范圍掃描索引比全表掃描要好,因為它只需要開始于索引樹的某一點,而結束于另一點,不用掃描全部索引。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • indexFull Index Scan,全索引掃描,indexALL的區(qū)別為index類型只遍歷索引樹,不用全表掃描。也就是說雖然ALLindex都是讀全表,但是index是從索引中讀的,ALL是從磁盤中讀取的。**因為索引文件通常比數(shù)據(jù)文件小,所以Index往往比ALL快。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • ALLFull Table Scan,沒有用到索引,全表掃描

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

從最好到最差依次是:system>const>eq_ref>ref>range>index>ALL。除了ALL沒有用到索引,其他級別都用到索引了,表示全表掃描。

**總結:**多看sql的type,如果是All,爭取優(yōu)化成其他的,一般來說,得保證查詢至少達到range級別,最好達到ref。

possible_keys列 哪些索引可能被使用

possible_keys:顯示可能應用在這張表中的索引,一個或者多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用。

key列 哪些索引被實際使用(判斷索引是否失效)

key:實際使用的索引。如果為NULL,則沒有使用索引。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

查詢中如果使用了覆蓋索引,則該索引僅僅出現(xiàn)在key列表中,不出現(xiàn)在possible_keys中。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

key_len列 索引中使用的字節(jié)數(shù)

key_len:表示索引中使用的字節(jié)數(shù),可通過該列計算查詢中使用的索引的長度。key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據(jù)表定義計算而得,不是通過表內(nèi)檢索出的。

在不損失精度的情況下,長度越短越好。一般是精度要求更高(根據(jù)姓名和城市查詢一個人比只根據(jù)姓名查詢一個人精度更高),key_len越長。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

key_len計算規(guī)則:https://blog.csdn.net/qq_34930488/article/details/102931490

ref列 表之間的引用

ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數(shù)。哪些列或常量被用于查找索引列上的值

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

由key_len可知t1表的idx col1 col2被充分使用,cl1匹配t2表的col1,co2匹配了一個常量,即’ac’

rows列 每張表有多少行被優(yōu)化器查詢

rows:根據(jù)表統(tǒng)計信息及索引選用情況,大致估算出找到所需的記錄需要讀取的行數(shù)

【沒建索引之前】

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【建索引之后】

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

Extra列 包含不適合在其他列中顯示但十分重要的額外信息

Extra列也會有一系列的值,下面是這些值的解釋:

  • Using filesort:說明MySQL會對數(shù)據(jù)使用一個外部的索引排序,而不是按照表內(nèi)的索引順序進行讀取。MySQL中無法利用索引完成的排序操作成為"文件內(nèi)排序"。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

總結:出現(xiàn)Using filesort盡快優(yōu)化

  • Using temporary:使用了臨時表(查詢結束之后還要刪除)保存中間結果,MySQL在対查詢結果排序時使用了臨時表。常見于排序order by和分組查詢group by。臨時表対系統(tǒng)性能損耗很大。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

總結:出現(xiàn)Using temporary盡快優(yōu)化

  • Using index:表示相應的SELECT操作中使用了覆蓋索引,避免訪問了表的數(shù)據(jù)行,效率不錯
  • 如果同時出現(xiàn)Using where,表示索引被用來執(zhí)行索引鍵值的查找;
  • 如果沒有同時出現(xiàn)Using where,表明索引用來讀取數(shù)據(jù)而非執(zhí)行查找動作。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

覆蓋索引:就是select的數(shù)據(jù)列只用從索引中就能夠取得,不必從數(shù)據(jù)表中讀取,換句話說查詢列要被所使用的索引覆蓋。 注意:如果要使用覆蓋索引,不要寫SELECT *,要寫出具體的字段。

  • Using where:表明使用了WHERE過濾。
  • Using join buffer:使用了連接緩存。如果join特別多,可以調大配置文件的buffer。
  • impossible whereWHERE子句的值總是false,不能用來獲取任何元組。

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

  • select tables optimized away:在沒有GROUPBY子句的情況下,基于索引優(yōu)化MIN/MAX操作或者對于MyISAM存儲引擎優(yōu)化COUNT(*)操作,不必等到執(zhí)行階段再進行計算查詢執(zhí)行計劃生成的階段即完成優(yōu)化。
  • distinct:找到第一個匹配的元組后停止同樣值的動作

EXPLAIN案例

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】,java開發(fā),mysql,sql,數(shù)據(jù)庫

文章說明

本文章為本人學習尚硅谷的學習筆記,文章中大部分內(nèi)容來源于尚硅谷視頻(點擊學習尚硅谷相關課程),也有部分內(nèi)容來自于自己的思考,發(fā)布文章是想幫助其他學習的人更方便地整理自己的筆記或者直接通過文章學習相關知識,如有侵權請聯(lián)系刪除,最后對尚硅谷的優(yōu)質課程表示感謝。文章來源地址http://www.zghlxwxcb.cn/news/detail-558168.html

到了這里,關于【MYSQL高級】Mysql的SQL性能分析【借助EXPLAIN分析】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • MySQL 優(yōu)化—— SQL 性能分析

    MySQL 客戶端連接成功后,通過 show [session | global] status 命令可以提供服務其狀態(tài)信息。通過下面指令,可以查看當前數(shù)據(jù)庫 CRUD 的訪問頻次: SHOW GLOBAL STATUS LIKE \\\'Com_______\\\'; 七個下劃線代表這個七個占位。 查詢數(shù)據(jù)庫中整體的 CURD 頻次,一般針對 select 比較多的數(shù)據(jù)庫。 慢查詢

    2024年02月13日
    瀏覽(89)
  • 【MySQL進階】SQL性能分析

    【MySQL進階】SQL性能分析

    MySQL 客戶端連接成功后,通過 show [session|global] status 命令可以提供服務器狀態(tài)信 息。通過如下指令,可以查看當前數(shù)據(jù)庫的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的訪問頻次: Com_delete: 刪除次數(shù)? ? Com_insert: 插入次數(shù) Com_select: 查詢次數(shù)? ?Com_update: 更新次數(shù) 我們可以在當前數(shù)據(jù)庫

    2024年02月07日
    瀏覽(89)
  • [MySQL] SQL優(yōu)化之性能分析

    [MySQL] SQL優(yōu)化之性能分析

    ??鍵盤敲爛,年薪30萬?? 目錄 一、索引優(yōu)化 1、索引是什么: 2、索引的數(shù)據(jù)結構: 3、索引種類: 4、sql分析(回表查詢) 二、定位慢查詢語句 1、慢查詢?nèi)罩?2、profile詳情 3、explain執(zhí)行計劃(重點) 4、查看執(zhí)行頻次 ? 1、索引是什么: 通過一些約束,快速查詢到相應字段

    2024年02月05日
    瀏覽(84)
  • mysql-sql性能分析工具

    mysql-sql性能分析工具

    ????????MySQL 客戶端連接成功后,通過 show [session|global] status 命令可以提供服務器狀態(tài)信息。通過如下指令,可以查看當前數(shù)據(jù)庫的INSERT、UPDATE、DELETE、SELECT的訪問頻次: -- session 是查看當前會話 ; -- global 是查詢?nèi)謹?shù)據(jù) ; SHOW GLOBAL STATUS LIKE \\\'Com_\\\'; 慢查詢?nèi)罩居涗浟怂袌?zhí)

    2024年02月12日
    瀏覽(92)
  • 【MySQL數(shù)據(jù)庫 | 第十九篇】SQL性能分析工具

    【MySQL數(shù)據(jù)庫 | 第十九篇】SQL性能分析工具

    目錄 ? 前言: SQL執(zhí)行頻率: 慢查詢?nèi)罩荆?profile: profile各個指令: 總結: ????????本篇我們將為大家講解SQL性能的分析工具,而只有熟練的掌握了性能分析的工具,才可以更好的對SQL語句進行優(yōu)化。雖然我們在自己練習的時候對這種優(yōu)化感知并不明顯,但是如果我們要

    2024年02月09日
    瀏覽(95)
  • MySQL SQL性能分析,快速排查SQL執(zhí)行慢的原因(SQL優(yōu)化 一)

    MySQL SQL性能分析,快速排查SQL執(zhí)行慢的原因(SQL優(yōu)化 一)

    在開發(fā)和維護數(shù)據(jù)庫應用程序時,優(yōu)化SQL查詢的性能是至關重要的。MySQL提供了一些強大的工具和技術,幫助我們進行SQL性能分析,找出潛在的瓶頸并進行相應的優(yōu)化。 查看SQL的執(zhí)行頻率 show [ session| global ] status 命令查看服務器狀態(tài)信息,可以查看當前數(shù)據(jù)庫的INSERT、UPDATE、

    2024年02月07日
    瀏覽(447)
  • MySQL數(shù)據(jù)庫進階第二篇(索引,SQL性能分析,使用規(guī)則)

    MySQL數(shù)據(jù)庫進階第二篇(索引,SQL性能分析,使用規(guī)則)

    本篇博客深入詳細地介紹了數(shù)據(jù)庫索引的概念和重要性。內(nèi)容包含:索引的概念和目標、索引的優(yōu)點與缺點。此外,博客還深入解析了三種主要的索引結構:B-Tree、B+Tree和Hash,提供了詳細的結構解析和優(yōu)化方法,并通過插圖進一步增強了理解。 博客的部分內(nèi)容專注于對B-Tr

    2024年02月21日
    瀏覽(114)
  • MySQL進階篇:索引(概述,結構,分類,語法,SQL性能分析,索引使用,設計原則)

    MySQL進階篇:索引(概述,結構,分類,語法,SQL性能分析,索引使用,設計原則)

    索引(index)是幫助MysQL 高效獲取數(shù)據(jù)的數(shù)據(jù)結構 ( 有序 )。 在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結構,這些數(shù)據(jù)結構以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結構上實現(xiàn)高級查找算法,這種數(shù)據(jù)結構就是索引。 優(yōu)缺點: MySQL的索引是在存儲

    2024年01月20日
    瀏覽(110)
  • MySQL性能分析常見方式

    1、慢查詢SQL日志 查看慢SQL是否開啟 執(zhí)行下面的命令開啟慢查詢?nèi)罩?修改慢查詢閾值 查看設置的慢查詢時間 查看慢查詢?nèi)罩疚恢?查看慢查詢數(shù)目 mysqldumpslow MySQL提供了的日志分析工具,可以幫助我們分析日志,查找、分析SQL。 刪除慢SQL日志 最后要關閉慢SQL日志,不然可能

    2024年02月07日
    瀏覽(19)
  • [MySQL 如何分析性能]

    慢查詢?nèi)罩?慢查詢?nèi)罩居涗浟怂袌?zhí)行時間超過指定參數(shù)(long_query_time,單位:秒,默認10秒)的所有SQL語句的日志。 MySQL的慢查詢?nèi)罩灸J沒有開啟,需要在MySQL的配置文件(/etc/my,cnf)中配置如下信息: 修改配置文件 profile詳情 show profiles 能夠在做 SQL優(yōu)化時幫助我們了解時

    2024年02月05日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包