日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

25、sql分析命令explain和desc

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
UNIONUNION中的第二個或后面的SELECT語句
DEPENDENT UNIONUNION中的第二個或后面的SELECT語句,取決于外面的查詢
UNION RESULTUNION的結果
SUBQUERY子查詢中的第一個SELECT
DEPENDENT SUBQUERY子查詢中的第一個SELECT,取決于外面的查詢
DERIVEDFROM子句的子查詢

?

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 WHEREwhere子句將用來限制哪些記錄匹配了下一個表或者發送到客戶端

可通過上述對表和sql分析來進行對應的修改,以使得性能達到最優

總結

以上是生活随笔為你收集整理的25、sql分析命令explain和desc的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。