mysql explain的用法(使用explain優(yōu)化查詢語句)
首先我來給一個簡單的例子,然后再來解釋explain列的信息。
表一:catefory 文章分類表:
CREATE TABLE IF NOT EXISTS `category` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM INSERT INTO `test`.`category` VALUES (NULL , '分類1'); INSERT INTO `test`.`category` VALUES (NULL , '分類2'); INSERT INTO `test`.`category` VALUES (NULL , '分類3');
表二:article文章表:
CREATE TABLE IF NOT EXISTS `article` ( `aid` int(11) NOT NULL, `cid` int(11) NOT NULL, `content` text NOT NULL, PRIMARY KEY (`aid`), KEY `cid` (`cid`) ) ENGINE=MyISAM INSERT INTO `test`.`article` (`aid`, `cid`, `content`) VALUES ('', '7', '腳本之家(jb51.net)教程');
執(zhí)行explain:
EXPLAIN SELECT name, content FROM category, article WHERE category.id = article.cid
得到結(jié)果:
EXPLAIN列的解釋:
id:選定的執(zhí)行計劃中查詢的序列號。表示查詢中執(zhí)行select子句或操作表的順序,id值越大優(yōu)先級越高,越先被執(zhí)行。id相同,執(zhí)行順序由上至下。
select_type:查詢類型 說明
1、SIMPLE:簡單的select查詢,不使用union及子查詢
2、PRIMARY:最外層的select查詢
3、UNION:UNION中的第二個或隨后的select查詢,不依賴于外部查詢的結(jié)果集
4、DEPENDENT UNION:UNION中的第二個或隨后的select查詢,依賴于外部查詢的結(jié)果集
5、UNION RESULT: UNION查詢的結(jié)果集SUBQUERY子查詢中的第一個select查詢,不依賴于外部查詢的結(jié)果集
6、DEPENDENT SUBQUERY:子查詢中的第一個select查詢,依賴于外部查詢的結(jié)果集DERIVED用于from子句里有子查詢的情況。
MySQL會遞歸執(zhí)行這些子查詢,把結(jié)果放在臨時表里。
7、UNCACHEABLE SUBQUERY:結(jié)果集不能被緩存的子查詢,必須重新為外層查詢的每一行進行評估
8、UNCACHEABLE UNION:UNION中的第二個或隨后的select查詢,屬于不可緩存的子查詢
table:顯示這一行的數(shù)據(jù)是關于哪張表的
type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、index和ALL
all: full table scan ;mysql將遍歷全表以找到匹配的行;
index : index scan; index 和 all的區(qū)別在于index類型只遍歷索引;
range:索引范圍掃描,對索引的掃描開始于某一點,返回匹配值的行,常見與between ,< ,>等查詢;
ref:非唯一性索引掃描,返回匹配某個單獨值的所有行,常見于使用非唯一索引即唯一索引的非唯一前綴進行查找;
eq_ref:唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配,常用于主鍵或者唯一索引掃描;
const,system:當mysql對某查詢某部分進行優(yōu)化,并轉(zhuǎn)為一個常量時,使用這些訪問類型。如果將主鍵置于where列表中,mysql就能將該查詢轉(zhuǎn)化為一個常量。
possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引??梢詾橄嚓P的域從WHERE語句中選擇一個合適的語句
key: 實際使用的索引。如果為NULL,則沒有使用索引。很少的情況下,MYSQL會選擇優(yōu)化不足的索引。這種情況下,可以在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數(shù)
rows:MYSQL認為必須檢查的用來返回請求數(shù)據(jù)的行數(shù)
Extra:關于MYSQL如何解析查詢的額外信息。將在表4.3中討論,但這里可以看到的壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結(jié)果是檢索會很慢。
因為真正的優(yōu)化會考慮到大數(shù)據(jù),我會在后面寫更詳細的優(yōu)化教程,今天累了!分享一個詳細的mysql explain語法及使用教程(Mysql_Explain_語法詳細解析.pdf)!
相關文章
用Jena將本體文件存入MySQL數(shù)據(jù)庫的實現(xiàn)方法
以下的文章主要介紹的是使用Jena,將本體文件存入MySQL數(shù)據(jù)庫的實際操作步驟2010-06-06mySQL中in查詢與exists查詢的區(qū)別小結(jié)
最近被一個朋友問到mySQL中in查詢和exists的區(qū)別,當然只是草草的回答了下,今天偶然看到了一篇關于mysql中的exists查詢的文章,讀完感覺太”冷落”它了,這里總結(jié)一下,也跟自己常用的in查詢做一下對比。有需要的朋友們可以參考借鑒,下面來一起學習學習吧。2016-11-11SQLyog錯誤號碼MySQL?plugin?caching_sha2_password?could?not?
這篇文章主要介紹了SQLyog錯誤號碼?plugin?caching_sha2_password?could?not?be?loaded的解決方法,需要的朋友可以參考下2023-06-06CentOs7 64位 mysql 5.6.40源碼安裝過程
這篇文章主要介紹了CentOs7 64位 mysql-5.6.40源碼安裝過程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01MySQL InnoDB ReplicaSet(副本集)簡單介紹
這篇文章主要介紹了MySQL InnoDB ReplicaSet(副本集)的相關資料,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下2021-04-04