這一次,徹底讀懂Mysql執行計畫

2021-08-28 05:19:20 字數 2878 閱讀 2102

本文主要介紹mysql執行計畫各個欄位的作用,以及如何利用mysql執行計畫優化我們的sql,本文主要面向後端開發程式設計師,以及需要和資料庫打交道的同學們。

所謂的執行計畫就是mysql如何執行一條sql語句,包括sql查詢的順序、是否使用索引、以及使用的索引資訊等內容。乙個例子:

基本語法

explain select ...

複製**

一些變體

explain extended select ...

複製**

上述的語句是將**形式的執行計畫轉化成select語句,在使用show warnings可以得到mysql優化器優化後的查詢語句。

explain partitions select ...

複製**

用於分割槽表的explain

不同版本的mysql和不同的儲存引擎執行計畫不完全相同,但基本資訊都差不多。mysql執行計畫主要包含以下資訊:

2.1 id

有一組數字組成。表示乙個查詢中各個子查詢的執行順序;

2.2 select_type

每個子查詢的查詢型別,一些常見的查詢型別。

idselect_type

description

1******

不包含任何子查詢或union等查詢

2primary

包含子查詢最外層查詢就顯示為primary

3subquery

selectwhere字句中包含的查詢

4derived

from字句中包含的查詢

5union

出現在union後的查詢語句中

6union result

從union中獲取結果集,例如上文的第三個例子

2.3 table

查詢的資料表,當從衍生表中查資料時會顯示x表示對應的執行計畫id

2.4 partitions

表分割槽、表建立的時候可以指定通過那個列進行表分割槽。 舉個例子:

create table tmp (

id int unsigned not null auto_increment,

name varchar(255),

primary key (id)

) engine = innodb

partition by key (id) partitions 5;

複製**

2.5 type

訪問型別

2.6 possible_keys

可能使用的索引,注意不一定會使用。查詢涉及到的字段上若存在索引,則該索引將被列出來。當該列為null時就要考慮當前的sql是否需要優化了。

2.7 key

顯示mysql在查詢中實際使用的索引,若沒有使用索引,顯示為null。

tips:查詢中若使用了覆蓋索引(覆蓋索引:索引的資料覆蓋了需要查詢的所有資料),則該索引僅出現在key列表中

2.8 key_length

索引長度 char()、varchar()索引長度的計算公式:

(character set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列長度 + 1(允許null) + 2(變長列)

複製**

其他型別索引長度的計算公式: ex:

create table `student` (

`id` int(11) unsigned not null auto_increment,

`name` varchar(128) not null default '',

`age` int(11),

primary key (`id`),

unique key `idx` (`name`),

key `idx_age` (`age`)

) engine=innodb auto_increment=2 default charset=utf8mb4;

複製**

name 索引長度為: 編碼為utf8mb4,列長為128,不允許為null,字段型別為varchar(128)key_length = 128 * 4 + 0 + 2 = 514;

age 索引長度:int型別佔4位,允許null,索引長度為5。

2.9 ref

表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值

2.10 rows

返回估算的結果集數目,並不是乙個準確的值。

2.11 extra

extra的資訊非常豐富,常見的有: 1.using index 使用覆蓋索引 2.using where 使用了用where子句來過濾結果集 3.using filesort 使用檔案排序,使用非索引列進行排序時出現,非常消耗效能,盡量優化。 4.using temporary 使用了臨時表

mysql 官方文件

這一次徹底搞清楚閉包函式

閉包 closure 是函式式程式設計的重要的語法結構。函式式程式設計是一種程式設計正規化 而面向過程程式設計和物件導向程式設計也都是程式設計正規化 在面向過程程式設計中,我們見到過函式 function 在物件導向程式設計中,我們見過物件 object 函式和物件的根本目的是以某種邏輯方式組織 並...

這一次,讓我仗劍而行

不知不覺,搞oi已有一年了。從一無所知到現在站在noip的大門前,我知道,機會只有一次。沒有失誤的機會,沒人會傾聽你的苦與你的累。小時候一直很怯懦,總是猶疑不決,辜負了多少韶光。所以,這一次,就讓我仗劍而行。這把劍並未成形,只有劍胎隱約可見。但在今天,少年笨拙地將劍抗在肩上,釀蹌著,卻一步一步,堅定...

這一次 VR離我們真的很近

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!從高考作文開始 從能夠營造紫色夢幻般舞台效果的全息投影技術,到已經走入人們日常生活的虛擬實境頭盔,近幾年,虛擬實境 一詞越來越引起人們廣泛的關注。對於不少普通人來說,對虛擬實境的印象還僅僅停留在娛樂方面,因為不夠了解,但是實際上,在軍事 醫學 裝備...