成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

要精通SQL優化?首先要看懂explain關鍵字

數據庫 MySQL
在MySQL中,我們知道加索引能提高查詢效率,這基本上算是常識了。但是有時候,我們加了索引還是覺得SQL查詢效率低下,我想看看有沒有使用到索引,掃描了多少行,表的加載順序等等,怎么查看呢?其實MySQL自帶的SQL分析神器Explain執行計劃就能完成以上的事情!

前言

在MySQL中,我們知道加索引能提高查詢效率,這基本上算是常識了。但是有時候,我們加了索引還是覺得SQL查詢效率低下,我想看看有沒有使用到索引,掃描了多少行,表的加載順序等等,怎么查看呢?其實MySQL自帶的SQL分析神器Explain執行計劃就能完成以上的事情!

Explain有哪些信息

先確認一下試驗的MySQL版本,這里使用的是5.7.31版本。

 

要精通SQL優化?首先要看懂explain關鍵字

只需要在SQL語句前加上explain關鍵字就可以查看執行計劃,執行計劃包括以下信息:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra,總共12個字段信息。

 

要精通SQL優化?首先要看懂explain關鍵字

然后創建三個表:

 

  1. CREATE TABLE `tb_student` ( 
  2.   `id` int(10) NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(36) NOT NULL
  4.   PRIMARY KEY (`id`), 
  5.   KEY `index_name` (`name`) USING BTREE 
  6. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='學生表'
  7.  
  8. CREATE TABLE `tb_class` ( 
  9.   `id` INT(10) primary key not null auto_increment, 
  10.   `nameVARCHAR(36) NOT NULL
  11.  `stu_id` INT(10) NOT NULL
  12.  `tea_id` INT(10) NOT NULL 
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班級表'
  14.  
  15. CREATE TABLE `tb_teacher` ( 
  16.   `id` INT(10) primary key not null auto_increment, 
  17.   `nameVARCHAR(36) NOT NULL 
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教師表'

Explain執行計劃詳解

explain的使用很簡單,只需要在SQL語句前加上關鍵字explain即可,關鍵是怎么看explain執行后返回的字段信息,這才是重點。

一、id

SELECT識別符。這是SELECT的查詢序列號。SQL執行的順序的標識,SQL從大到小的執行。id列有以下幾個注意點:

id相同時,執行順序由上至下。

id不同時,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行。

  1. EXPLAIN SELECT * FROM `tb_student` WHERE id IN (SELECT stu_id FROM tb_class WHERE tea_id IN(SELECT id FROM tb_teacher WHERE `name` = '馬老師')); 

 

要精通SQL優化?首先要看懂explain關鍵字

根據原則,當id不同時,SQL從大到小執行,id相同則從上到下執行。

二、select_type

表示select查詢的類型,用于區分各種復雜的查詢,例如普通查詢,聯合查詢,子查詢等等。

SIMPLE

表示最簡單的查詢操作,也就是查詢SQL語句中沒有子查詢、union等操作。

PRIMARY

當查詢語句中包含復雜查詢的子部分,表示復雜查詢中最外層的 select。

SUBQUERY

當 select 或 where 中包含有子查詢,該子查詢被標記為SUBQUERY。

DERIVED

在SQL語句中包含在from子句中的子查詢。

UNION

表示在union中的第二個和隨后的select語句。

UNION RESULT

代表從union的臨時表中讀取數據。

EXPLAIN SELECT u.`name` FROM ((SELECT s.id,s.`name` FROM `tb_student` s) UNION (SELECT t.id,t.`name` FROM tb_teacher t)) AS u;

代表是id為2和3的select查詢的結果進行union操作。

 

要精通SQL優化?首先要看懂explain關鍵字

MATERIALIZED

MATERIALIZED表示物化子查詢,子查詢來自視圖。

三、table

表示輸出結果集的表的表名,并不一定是真實存在的表,也有可能是別名,臨時表等等。

四、partitions

表示SQL語句查詢時匹配到的分區信息,對于非分區表值為NULL,當查詢的是分區表則會顯示分區表命中的分區情況。

五、type

需要重點關注的一個字段信息,表示查詢使用了哪種類型,在 SQL優化中是一個非常重要的指標,依次從優到差分別是:system > const > eq_ref > ref > range > index > ALL。

system和const

單表中最多有一條匹配行,查詢效率最高,所以這個匹配行的其他列的值可以被優化器在當前查詢中當作常量來處理。通常出現在根據主鍵或者唯一索引進行的查詢,system是const的特例,表里只有一條元組匹配時(系統表)為system。

 

要精通SQL優化?首先要看懂explain關鍵字

 

要精通SQL優化?首先要看懂explain關鍵字

eq_ref

primary key 或 unique key 索引的所有部分被連接使用 ,最多只會返回一條符合條件的記錄,所以這種類型常出現在多表的join查詢。

 

要精通SQL優化?首先要看懂explain關鍵字

ref

相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前綴,可能會找到多個符合條件的行。

 

要精通SQL優化?首先要看懂explain關鍵字

range

使用索引選擇行,僅檢索給定范圍內的行。一般來說是針對一個有索引的字段,給定范圍檢索數據,通常出現在where語句中使用 bettween...and、<、>、<=、in 等條件查詢 。

 

要精通SQL優化?首先要看懂explain關鍵字

index

掃描全表索引,通常比ALL要快一些。

 

要精通SQL優化?首先要看懂explain關鍵字

ALL

全表掃描,MySQL遍歷全表來找到匹配行,性能最差。

 

要精通SQL優化?首先要看懂explain關鍵字

六、possible_keys

表示在查詢中可能使用到的索引來查找,而列出的索引并不一定是最終查詢數據所用到的索引。

七、key

跟possible_keys有所區別,key表示查詢中實際使用到的索引,若沒有使用到索引則顯示為NULL。

八、key_len

表示查詢用到的索引key的長度(字節數)。如果單列索引,那么就會把整個索引長度計算進去,如果是聯合索引,不是所有的列都用到,那么就只計算實際用到的列,因此可以根據key_len來判斷聯合索引是否生效。

九、ref

顯示了哪些列或常量被用于查找索引列上的值。常見的值有:const,func,null,字段名。

十、rows

mysql估算要找到我們所需的記錄,需要讀取的行數。可以通過這個數據很直觀的顯示 SQL 性能的好壞,一般情況下 rows 值越小越好。

十一、filtered

指返回結果的行占需要讀到的行(rows列的值)的百分比,一般來說越大越好。

十二、Extra

表示額外的信息。此字段能夠給出讓我們深入理解執行計劃進一步的細節信息。

Using index

說明在select查詢中使用了覆蓋索引。覆蓋索引的好處是一條SQL通過索引就可以返回我們需要的數據。

 

要精通SQL優化?首先要看懂explain關鍵字

Using where

查詢時沒使用到索引,然后通過where條件過濾獲取到所需的數據。

 

要精通SQL優化?首先要看懂explain關鍵字

Using temporary

表示在查詢時,MySQL需要創建一個臨時表來保存結果。臨時表一般會比較影響性能,應該盡量避免。

 

要精通SQL優化?首先要看懂explain關鍵字

有時候使用DISTINCT去重時也會產生Using temporary。

 

要精通SQL優化?首先要看懂explain關鍵字

Using filesort

我們知道索引除了查詢中能起作用外,排序也是能起到作用的,所以當SQL中包含 ORDER BY 操作,而且無法利用索引完成排序操作的時候,MySQL不得不選擇相應的排序算法來實現,這時就會出現Using filesort,應該盡量避免使用Using filesort。

 

要精通SQL優化?首先要看懂explain關鍵字

總結

一般優化SQL語句第一步是要知道這條SQL語句有哪些需要優化的,explain執行計劃就相當于一面鏡子,能把詳細的執行情況給開發者列出來。所以說善用explain執行計劃,能解決80%的SQL優化問題。

explain的信息中,一般我們要關心的是type,看是什么級別,如果是在互聯網公司一般需要在range以上的級別,接著關心的是Extra,有沒有出現filesort或者using template,一旦出現就要想辦法避免,接著再看key使用的是什么索引,還有看filtered篩選比是多少。

這篇文章就講到這里了,希望大家看完之后能對SQL優化有更深入的理解,感謝大家的閱讀。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2023-11-10 09:29:30

MySQLExplain

2011-05-05 14:26:09

聯想商務本

2011-09-05 16:07:47

云計算虛擬化數據庫

2010-03-29 16:11:57

無線上網卡

2011-09-05 09:22:30

云計算遷移IT資產

2010-09-09 09:08:57

2021-06-23 21:16:31

機器人人工智能AI

2023-03-30 08:28:57

explain關鍵字MySQL

2017-04-08 19:08:45

Linux服務器命令

2025-03-12 10:55:30

2025-01-24 14:57:24

2021-10-13 06:49:13

SQL Server優化

2017-09-21 12:15:36

機器學習概率學習

2019-10-15 14:14:26

Linuxshell運維

2020-08-26 14:40:38

explainMySQL數據庫

2011-02-25 14:42:10

SQLwith關鍵字

2010-07-23 14:32:43

SQL Server

2010-11-12 14:49:28

SQL Server外

2021-04-18 07:58:22

SQL Server數據庫Apply

2019-08-28 16:38:49

finalJava編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久 | 欧美午夜一区 | a毛片| aaa综合国产| 色婷婷国产精品综合在线观看 | 国产精品亚洲综合 | 欧美黄视频 | 中文字幕在线第一页 | 希岛爱理在线 | 在线播放一区二区三区 | 国产精品日产欧美久久久久 | 国产三级| 国产自产c区 | 狠狠色综合久久丁香婷婷 | 精品一区二区电影 | 蜜桃在线视频 | 午夜精品久久久久久久久久久久 | 日本韩国电影免费观看 | 日本成人一区二区 | 中文字幕日韩欧美一区二区三区 | 亚洲一区二区三区 | 精品久久久久久久 | 精品一区二区三区91 | 日韩一区二区三区视频 | 国产欧美一区二区精品久导航 | 国产精品美女久久久久久免费 | 久久精品国产99国产 | 亚洲成人精选 | 我我色综合 | 日本久草 | 一级毛片视频免费观看 | 欧美性视频在线播放 | 精品久久久久久 | 久久国产精品偷 | 欧美啪啪 | www.五月婷婷.com | 91传媒在线播放 | 亚洲精品欧美一区二区三区 | 免费看国产一级特黄aaaa大片 | 欧美日韩国产中文 | 国产日韩免费视频 |