調用explain
explain可以查看查詢計劃的信息,
如果sql語句中包含子查詢,mysql依然會執行子查詢,將結果放到一個臨時表中。然后完成外層的優化查詢
## EXPLAIN中的列
explain中總是有相同的列。
### id 列
這個id包含一個標號,標識select所屬的行。如果語句中沒有子查詢或者聯合,id唯一。
mysql將查詢分為簡單查詢和復雜查詢,復雜查詢分為子查詢、派生表(FROM中的子查詢)、union查詢。
### select_type 列
這一列顯示對應的行是簡單查詢還是復雜查詢。,如果是簡單 查詢 就是simple。如果是復雜查詢,則是以下的幾種值
1. SUBQUERY
包含在select列表中的select
```sql
select (select id from user) from user
```
2. DERIVED
DERIVED值用來表示包含在from子查詢中的select。
```sql
select id from (select id from user where id >100);
```
3. UNION
在union中的第二個值和select 都被標記為union
4. union result
用來從臨時表檢索結果的select被標記為union result
### table 列
對應訪問的表。
### type 列
mysql決定查找表中的行
- all
全表掃描。
- index
跟全表掃描一樣,只是按照索引的順序進行。優點避免了排序,缺點就是按照整個索引讀取整個表的開銷。
- range
范圍掃描。就是一個有限制的索引掃描,開始于索引的一點,結束到匹配的值。比如 between 或者where 帶有 范圍的條件
- ref
這是一種索引訪問,返回匹配到某個單個值的行,一般是非唯一索引或者非唯一索引的前綴索引。
- eq_ref
使用這種索引查找,一般是通過唯一索引或者主鍵索引查找的時候看到
- const system
mysql對查詢的部分進行優化轉成一個常量的時候,比如把一行中的主鍵放入到where條件中
```sql
select * from user where name = id ;
```
- null
mysql在優化階段分解查詢語句,在執行階段不用訪問表或者訪問索引。
### possible_keys
這列顯示的是mysql可以使用的索引
### key 列
決定了mysql 采用哪個索引來對表的訪問。
### key_len 列
mysql在索引使用的字節數
### ref列
顯示之前的表在key列記錄的索引,中,查找值所用的列或常量。
### rows 列
估算查到需要結果的而讀取到的行數。
### fiteread 列
查詢記錄和總記錄的一個百分比
### extra 列
額外的信息
- using index 使用覆蓋索引
- using where
- using temproary 使用臨時表
- using filesort 使用文件排序
-
- PC
- IO模型
- Inode介紹
- Linux
- Linux基本操作命令
- Linux網絡相關命令
- Crontab計劃任務
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本語法
- 面向對象
- 錯誤和異常處理
- 命名空間
- PHP7
- 正則表達式
- Hashtable
- 變量的內部實現
- PHP-FPM
- PHP運行原理
- swoole
- mysql
- SQL標準
- mysql三范式
- 存儲引擎
- Mysql事務
- Mysql索引
- Mysql優化
- Explain
- MySQL索引原理及慢查詢優化
- MongoDb
- 計算機網絡
- IP協議
- TCP(傳輸控制協議)
- UDP(用戶數據報協議)
- HTTP 協議
- HTTPS
- HTTP的基本優化
- Websocket協議
- 版本控制器
- Git
- Svn
- 數據結構
- 數組
- 鏈表
- 算法