|
最近在對(duì)sql進(jìn)行性能優(yōu)化因此對(duì)explain相關(guān)的知識(shí)進(jìn)行一個(gè)簡(jiǎn)單的整理歸納。
EXPLAIN:
為SELECT語(yǔ)句中使用到的每個(gè)表返回一條 SELECT 執(zhí)行的詳細(xì)信息;按照MySQL在處理語(yǔ)句時(shí)讀取它們的順序列出這些表。
命令輸出格式
id = 1
select_type = SIMPLE
table = clazz
partitions =
type = const
possible_keys = PRIMARY
key = PRIMARY
key_len = 98
ref = const
rows = 1
filtered = 100.00
Extra =
- id:SELECT 標(biāo)識(shí)符,SQL執(zhí)行的順序的標(biāo)識(shí),SQL從大到小的執(zhí)行
- id相同時(shí),執(zhí)行順序由上至下
- 如果是子查詢,id的序號(hào)會(huì)遞增,id值越大優(yōu)先級(jí)越高,越先被執(zhí)行
- 如果id相同,則認(rèn)為是一組,從上往下順序執(zhí)行;在所有組中,id值越大,優(yōu)先級(jí)越高,越先執(zhí)行
- select_type
- SIMPLE:簡(jiǎn)單的SELECT未使用 UNION 查詢或子查詢
- PRIMARY:表示此查詢是最外層的SELECT(如兩表做UNION或者存在子查詢的外層的表操作為PRIMARY,內(nèi)層的操作為UNION)
- UNION:表示UNION操作中,查詢中處于內(nèi)層的SELECT(內(nèi)層的SELECT語(yǔ)句與外層的SELECT語(yǔ)句沒(méi)有依賴關(guān)系)
- DEPENDENT UNION:表示UNION操作中,查詢中處于內(nèi)層的SELECT(內(nèi)層的SELECT語(yǔ)句與外層的SELECT語(yǔ)句有依賴關(guān)系)
- UNION RESULT:UNION 操作的結(jié)果,id值通常為null
- SUBQUERY:子查詢中的第一個(gè) SELECT
- DEPENDENT SUBQUERY:子查詢中的第一個(gè) SELECT, 子查詢依賴于外層的查詢結(jié)果
- ERIVED:被驅(qū)動(dòng)的SELECT子查詢(子查詢位于from子句)
- MATERIALZED:物化子查詢(對(duì)此查詢會(huì)創(chuàng)建臨時(shí)表,將制定表物化為臨時(shí)表)
- UNCACHEABLE SUBQUERY:無(wú)法緩存子查詢的結(jié)果,每次都需要計(jì)算
- UNCACHEABLE UNION:UNION操作紅內(nèi)層的子查詢無(wú)法被物化(類似于UNCACHABLESUBQUERY)
- table:表示查詢涉及的表或衍生表
![]()
- type
- ALL:全表掃描,mysql將便利全表數(shù)據(jù)直至找到匹配的行
- index:全索引掃描,遍歷索引樹(shù)
- range: 范圍掃描,基于索引做掃描,如between,in,>=,like等操作
- ref: 表示上述的連接匹配條件,即哪些列或產(chǎn)量被用于查找索引列上的值
- eq_ref: 類似ref區(qū)別在于索引是唯一索引,對(duì)于每個(gè)索引鍵值表中只有一條記錄匹配,即多表連接中使用primary key或者unique key作為關(guān)聯(lián)條件
- const: 只讀取一次就能獲得數(shù)據(jù)(如:主鍵)
- system: const的特例,查詢的表中只有一行的情況下,使用system
- null: mysql在優(yōu)化的過(guò)程中分解語(yǔ)句,執(zhí)行時(shí)甚至不用訪問(wèn)表或索引,例如從一個(gè)索引列里面選取最小值可以通過(guò)單獨(dú)索引查找完成
- partitions:記錄與查詢匹配的分區(qū)
- possible_keys:表示在查詢時(shí), 能夠使用到的索引具體使用了哪些索引, 由 key 字段決定.
- key_len:表示查詢優(yōu)化器使用了索引的字節(jié)數(shù). 這個(gè)字段可以評(píng)估組合索引是否完全被使用, 或只有最左部分字段被使用到
- 字符串
- char(n): n 字節(jié)長(zhǎng)度
- varchar(n): 如果是 utf8 編碼, 則是 3 n + 2字節(jié); 如果是 utf8mb4 編碼, 則是 4 n + 2 字節(jié)
- 數(shù)值類型
- TINYINT: 1字節(jié)
- SMALLINT: 2字節(jié)
- MEDIUMINT: 3字節(jié)
- INT: 4字節(jié)
- BIGINT: 8字節(jié)
- 時(shí)間類型
- DATE: 3字節(jié)
- TIMESTAMP: 4字節(jié)
- DATETIME: 8字節(jié)
- 字段屬性: NULL 屬性 占用一個(gè)字節(jié). 如果一個(gè)字段是 NOT NULL 的, 則沒(méi)有此屬性.
- ref:被用來(lái)標(biāo)識(shí)那些用來(lái)進(jìn)行索引比較的列或者常量
- rows:估算 SQL 要查找到結(jié)果集需要掃描讀取的數(shù)據(jù)行數(shù)
- filterd:給出了一個(gè)百分比的值,這個(gè)百分比值和 rows 列的值一起使用
- Extra: 附加與操作相關(guān)聯(lián)的信息
- Using filesort
- 表示 MySQL 需額外的排序操作, 不能通過(guò)索引順序達(dá)到排序效果,查詢 CPU 資源消耗大建議優(yōu)化去掉,
- Using index
- "覆蓋索引掃描", 表示查詢?cè)谒饕龢?shù)中就可查找所需數(shù)據(jù), 不用掃描表數(shù)據(jù)文件, 往往說(shuō)明性能不錯(cuò)
- Using where
- where條件用于篩選出與下一個(gè)表匹配的數(shù)據(jù)然后返回給客戶端
- Using temporary
- 查詢有使用臨時(shí)表, 一般出現(xiàn)于排序, 分組和多表 join 的情況, 查詢效率不高 建議優(yōu)化.
- Impossible where
- WHERE條件過(guò)濾沒(méi)有效果,或者是始終選不出任何列(理解為最終是全表掃描)
- Impossible HAVING
- HAVING條件過(guò)濾沒(méi)有效果,或者是始終選不出任何列(理解為返回已有查詢的結(jié)果集)
- unique row not found
- Using sort_union(...),Using union(...),Using intersect(...)
- 表示在index_merge的連接類型中索引合并是怎么樣完成的,及使用了怎樣特別的算法
|