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