成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL之EXPLAIN語法詳解

數據庫 MySQL
如果在SELECT語句前放上關鍵詞EXPLAIN,MySQL將解釋它如何處理SELECT,提供有關表如何聯接和聯接的次序。借助于EXPLAIN,可以知道什么時候必須為表加入索引以得到一個使用索引來尋找記錄的更快的SELECT。

1、EXPLAIN tbl_name

EXPLAIN tbl_name是DESCRIBE tbl_name或SHOW COLUMNS FROM tbl_name的一個同義詞。

2、EXPLAIN [EXTENDED] SELECT select_options

如果在SELECT語句前放上關鍵詞EXPLAIN,MySQL將解釋它如何處理SELECT,提供有關表如何聯接和聯接的次序。

借助于EXPLAIN,可以知道什么時候必須為表加入索引以得到一個使用索引來尋找記錄的更快的SELECT。

還可以知道優化器是否以一個***次序聯接表。為了強制優化器讓一個SELECT語句按照表命名順序的聯接次序,語句應以STRAIGHT_JOIN而不只是SELECT開頭。

EXPLAIN為用于SELECT語句中的每個表返回一行信息。表以它們在處理查詢過程中將被MySQL讀入的順序被列出。MySQL用一遍掃描多次聯接(single-sweep multi-join)的方式解決所有聯接。這意味著MySQL從***個表中讀一行,然后找到在第二個表中的一個匹配行,然后在第3個表中等等。當所有的表處理完后,它輸出選中的列并且返回表清單直到找到一個有更多的匹配行的表。從該表讀入下一行并繼續處理下一個表。

當使用EXTENDED關鍵字時,EXPLAIN產生附加信息,可以用SHOW WARNINGS瀏覽。該信息顯示優化器限定SELECT語句中的表和列名,重寫并且執行優化規則后SELECT語句是什么樣子,并且還可能包括優化過程的其它注解。

EXPLAIN的每個輸出行提供一個表的相關信息,并且每個行包括下面的列:

id:SELECT識別符。這是SELECT的查詢序列號。

select_type:SELECT類型。

  1. SIMPLE: 簡單SELECT(不使用UNION或子查詢)
  2. PRIMARY: 最外面的SELECT
  3. UNION:UNION中的第二個或后面的SELECT語句
  4. DEPENDENT UNION:UNION中的第二個或后面的SELECT語句,取決于外面的查詢
  5. UNION RESULT:UNION的結果
  6. SUBQUERY:子查詢中的***個SELECT
  7. DEPENDENT SUBQUERY:子查詢中的***個SELECT,取決于外面的查詢
  8. DERIVED:導出表的SELECT(FROM子句的子查詢)

table:表名

type:聯接類型

  1. system:表僅有一行(=系統表)。這是const聯接類型的一個特例。
  2. const:表最多有一個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優化器剩余部分認為是常數。const用于用常數值比較PRIMARY KEY或UNIQUE索引的所有部分時。
  3. eq_ref:對于每個來自于前面的表的行組合,從該表中讀取一行。這可能是***的聯接類型,除了const類型。它用在一個索引的所有部分被聯接使用并且索引是UNIQUE或PRIMARY KEY。eq_ref可以用于使用= 操作符比較的帶索引的列。比較值可以為常量或一個使用在該表前面所讀取的表的列的表達式。
  4. ref:對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的前綴,或如果鍵不是UNIQUE或PRIMARY KEY(換句話說,如果聯接不能基于關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接類型是不錯的。ref可以用于使用=或<=>操作符的帶索引的列。
  5. ref_or_null:該聯接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經常使用該聯接類型的優化。
  6. index_merge:該聯接類型表示使用了索引合并優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
  7. unique_subquery:該類型替換了下面形式的IN子查詢的ref:value IN (SELECT primary_key FROMsingle_table WHERE some_expr);unique_subquery是一個索引查找函數,可以完全替換子查詢,效率更高。
  8. index_subquery:該聯接類型類似于unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
  9. range:只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該類型中ref列為NULL。當使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比較關鍵字列時,可以使用range
  10. index:該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數據文件小。
  11. all:對于每個來自于先前的表的行組合,進行完整的表掃描。如果表是***個沒標記const的表,這通常不好,并且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常數值或列值被檢索出。

#p#

possible_keys:possible_keys列指出MySQL能使用哪個索引在該表中找到行。注意,該列完全獨立于EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實際上不能按生成的表次序使用。

key:key列顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL。要想強制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len:key_len列顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。注意通過key_len值我們可以確定MySQL將實際使用一個多部關鍵字的幾個部分。

ref:ref列顯示使用哪個列或常數與key一起從表中選擇行。

rows:rows列顯示MySQL認為它執行查詢時必須檢查的行數。

Extra:該列包含MySQL解決查詢的詳細信息。

  1. Distinct:MySQL發現第1個匹配行后,停止為當前的行組合搜索更多的行。
  2. Not exists:MySQL能夠對查詢進行LEFT JOIN優化,發現1個匹配LEFT JOIN標準的行后,不再為前面的的行組合在該表內檢查更多的行。
  3. range checked for each record (index map: #):MySQL沒有發現好的可以使用的索引,但發現如果來自前面的表的列值已知,可能部分索引可以使用。對前面的表的每個行組合,MySQL檢查是否可以使用range或index_merge訪問方法來索取行。
  4. Using filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。通過根據聯接類型瀏覽所有行并為所有匹配WHERE子句的行保存排序關鍵字和行的指針來完成排序。然后關鍵字被排序,并按排序順序檢索行。
  5. Using index:從只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的列信息。當查詢只使用作為單一索引一部分的列時,可以使用該策略。
  6. Using temporary:為了解決查詢,MySQL需要創建一個臨時表來容納結果。典型情況如查詢包含可以按不同情況列出列的GROUP BY和ORDER BY子句時。
  7. Using where:WHERE子句用于限制哪一個行匹配下一個表或發送到客戶。除非你專門從表中索取或檢查所有行,如果Extra值不為Using where并且表聯接類型為ALL或index,查詢可能會有一些錯誤。
  8. Using sort_union(...), Using union(...), Using intersect(...):這些函數說明如何為index_merge聯接類型合并索引掃描。
  9. Using index for group-by:類似于訪問表的Using index方式,Using index for group-by表示MySQL發現了一個索引,可以用來查詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實際的表。并且,按最有效的方式使用索引,以便對于每個組,只讀取少量索引條目。

通過相乘EXPLAIN輸出的rows列的所有值,你能得到一個關于一個聯接如何的提示。這應該粗略地告訴你MySQL必須檢查多少行以執行查詢。當你使用max_join_size變量限制查詢時,也用這個乘積來確定執行哪個多表SELECT語句。

原文鏈接:http://blog.csdn.net/gzh0222/article/details/6707760

【編輯推薦】

  1. 教你如何利用MySQL學習MongoDB
  2. Craigslist采用MongoDB替代MySQL
  3. MySQL中的NoSQL插件
  4. SQL與NoSQL——MySQL與NoSQL的融合
  5. 論MySQL何時使用索引,何時不使用索引

 

 

 

 

 

 

 

責任編輯:艾婧 來源: gzh0222的專欄
相關推薦

2023-11-10 09:29:30

MySQLExplain

2017-07-27 20:00:47

MySQLEXPLAIN命令

2010-11-11 10:18:59

select into

2017-04-07 14:30:26

2010-08-31 08:51:58

marginCSS

2024-12-11 13:14:27

2023-09-21 10:55:51

MysqlSQL語句

2009-12-10 16:12:07

EXPLAIN

2019-09-20 10:00:33

SQLMySQL數據

2021-02-20 08:40:19

HiveExplain底層

2011-05-24 09:10:24

MySQLMongoDB

2023-02-10 14:54:20

編譯工具cmake

2011-08-19 11:00:54

SQL Server WaitFor命令

2011-08-19 10:40:27

SQL Server Merge命令

2010-09-14 16:00:34

sql select語

2024-06-21 09:37:02

DefPython函數

2010-09-06 13:15:48

CSS定位

2011-08-18 14:25:26

OracleEXPLAIN PLA

2010-09-26 10:27:22

SQL替換語句

2009-12-18 15:06:10

Ruby常用庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线 | 91佛爷在线观看 | 亚洲二区精品 | 精品国产乱码久久久久久牛牛 | 日本爱爱视频 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 日韩精品一区二区三区免费视频 | 午夜一级黄色片 | 最新中文在线视频 | 国产欧美精品一区二区三区 | 中文字幕精品一区二区三区在线 | 999免费视频 | 日本不卡免费新一二三区 | 国产精品久久福利 | 中文字幕在线精品 | www.亚洲精品| 中文视频在线 | 99re热精品视频 | 涩涩视频在线播放 | 日韩黄 | 美国黄色毛片 | 国产精品国产a | 国产精品视频一区二区三区 | 成人福利电影 | 六月成人网 | 一级做a爰片性色毛片16 | 国产成人久久精品一区二区三区 | 四虎影院在线观看免费视频 | 久久99精品久久久久久 | 日韩视频在线一区 | 国产精品久久九九 | 夜夜夜久久久 | 日韩av免费看| 欧美视频一区二区三区 | 欧美精品一区在线观看 | 成人在线免费网站 | 久久久久久国 | 日韩精品专区在线影院重磅 | 国产精品九九九 | 欧美黄色一区 | 网址黄 |