25、sql分析命令explain和desc
生活随笔
收集整理的這篇文章主要介紹了
25、sql分析命令explain和desc
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?explain和desc命令的效果相同,命令格式如下:
mysql> explain SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT JOIN teacher t ON s.name = t.name; +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | s | index | NULL | name | 768 | NULL | 3 | Using index | | 1 | SIMPLE | t | ALL | NULL | NULL | NULL | NULL | 10 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ 2 rows in setmysql> desc SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT JOIN teacher t ON s.name = t.name; +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | s | index | NULL | name | 768 | NULL | 3 | Using index | | 1 | SIMPLE | t | ALL | NULL | NULL | NULL | NULL | 10 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ 2 rows in set mysql> explain student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | MUL | NULL | | | age | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in setmysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | MUL | NULL | | | age | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set?
用于數據表:
mysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type ? ? ? ? | Null | Key | Default | Extra ? ? ? ? ?| +-------+--------------+------+-----+---------+----------------+ | id ? ?| int(11) ? ? ?| NO ? | PRI | NULL ? ?| auto_increment | | name ?| varchar(255) | YES ?| MUL | NULL ? ?| ? ? ? ? ? ? ? ?| | age ? | int(11) ? ? ?| YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?| +-------+--------------+------+-----+---------+----------------+Field:表中的字段名 Type:字段對應的類型 Null:可否為空 Key:鍵類型,主鍵、索引鍵。。。 Default:默認值 Extra:其他信息用于sql:
mysql> explain SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT JOIN teacher t ON s.name = t.name; +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | s | index | NULL | name | 768 | NULL | 3 | Using index | | 1 | SIMPLE | t | ALL | NULL | NULL | NULL | NULL | 10 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+id:查詢的序列號select_type:查詢的類型,普通查詢、聯合查詢、子查詢等table:輸出行所引用的表名type:聯合查詢的訪問類型,此屬性比較重要possible_keys:表示能使用哪個索引在該表中找到行key:實際使用的索引鍵,如果沒有索引被選擇,鍵是NULLkey_len:實際使用的鍵長度ref:顯示哪個字段或常數與key一起被使用進行查詢rows:表示要遍歷多少數據才能找到滿足條件的數據,在innodb上是不準確的extra:附加信息著重解釋:
select_type字段:
| SIMPLE | 簡單查詢,不適用UNION或子查詢 |
| PRIMARY | 最外層的SELECT |
| UNION | UNION中的第二個或后面的SELECT語句 |
| DEPENDENT UNION | UNION中的第二個或后面的SELECT語句,取決于外面的查詢 |
| UNION RESULT | UNION的結果 |
| SUBQUERY | 子查詢中的第一個SELECT |
| DEPENDENT SUBQUERY | 子查詢中的第一個SELECT,取決于外面的查詢 |
| DERIVED | FROM子句的子查詢 |
?
type字段:
| SYSTEM | 表中只有一行記錄 |
| CONST | 表中最多只有一行匹配的記錄,他在查詢一開始就會被讀取出來,被作為一個恒定值 |
| EQ_REF | 表中會有一行記錄被讀取出來和以前一個表中讀取出來的記錄做聯合,這是最好的連接類型,他用在索引所有字段都用于做連接并且這個索引是primary key或unique類型 |
| REF | 表中所有符合檢索值的記錄都會被取出來和從上一個表中取出來的記錄做聯合,用于連接程序無法根據鍵值只取得一條記錄的情況 |
| REF_OR_NULL | 和REF類似,在檢索的時候會搜索NULL值的記錄,經常用于子查詢 |
| UNIQUE_SUBQUERY | 帶in的子查詢來代替ref |
| INDEX_SUBQUERY | 用子查詢來代替in |
| RANGE | 只有在給定范圍的記錄才會被取出來,利用索引來取得一條記錄,key字段表示使用了那個索引 |
| INDEX | 只掃描所引樹 |
| ALL | 對表做全部掃描,應盡量避免 |
extra字段:
| DISTINCT | 找到當前記錄的匹配聯合結果的第一條記錄之后,不再搜索其他記錄 |
| NOT EXISTS | 做一個left join優化,在當前表中找到和前一條記錄符合left join條件后,就不再搜索更多的記錄 |
| RANGE CHECKED FOR EACH RECORD (INDEX MAP:#) | 沒有找到合適的可用的索引,取代的辦法是:對于前一個表的每一個行連接,它會做一個校驗以決定該使用那個索引,并且使用這個索引來從表中取得記錄。 |
| USING FILESORT | 需要額外做一遍排序操作,以拍好的順序取得記錄,應盡量避免 |
| USING INDEX | 直接從索引樹中的信息取得記錄,不再去掃描實際的記錄 |
| USING TEMPORARY | 創建臨時表存儲結果以完成查詢,通常發生在查詢時包含了group by和order by子句,應盡量避免 |
| USING WHERE | where子句將用來限制哪些記錄匹配了下一個表或者發送到客戶端 |
可通過上述對表和sql分析來進行對應的修改,以使得性能達到最優
總結
以上是生活随笔為你收集整理的25、sql分析命令explain和desc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你配置一个linux中ftp服务器li
- 下一篇: java实现下载时进度条提示