mysql数据库关键字及用法_mysql唯一索引关键字(关系型数据库管理系统)
利用mysql explain來對sql語句進行優化,你需要懂這些關鍵字各表示的含義,這樣優化才有的放矢。
語法格式如下:
EXPLAIN SELECT SQL
語法格式說明:
EXPLAIN:分析查詢語句的關鍵字。
SELECT:執行查詢語句的關鍵字。
SQL:查詢語句。
接下來對輸出結果進行簡單的解釋。
(1)id:表示SELECT語句的序列號,有多少個SELECT語句就有多少個序列號。如果當前行的結果數據中引用了其他行的結果數據,則該值為NULL。
(2)select_type:查詢類型,表示當前SQL語句是簡單查詢還是復雜查詢。常見取值如下:
SIMPLE:簡單查詢,不包含任何連接查詢和子查詢。
PRIMARY:主查詢或者包含子查詢時最外層的查詢語句。
UNION:當前SQL語句是連接查詢時,表示連接查詢的第二個SELECT語句或者第二個后面的SELECT語句。
DEPENDENT UNION:含義與UNION幾乎相同,但是DEPENDENT UNION取決于外層的查詢語句。
UNION RESULT:表示連接查詢的結果信息。
SUBQUERY:表示子查詢中的第一個查詢語句。
DEPENDENT SUBQUERY:含義與SUBQUERY幾乎相同,但是DEPENDENTSUBQUERY取決于外層的查詢語句。
DERIVED:表示FROM子句中的子查詢。
MATERIALIZED:表示實例化子查詢。
UNCACHEABLE SUBQUERY:表示不緩存子查詢的結果數據,重新計算外部查詢的每一行數據。
UNCACHEABLE UNION:表示不緩存連接查詢的結果數據,每次執行連接查詢時都會重新計算數據結果。
(3)table:當前查詢(連接查詢、子查詢)所在的數據表。
(4)partitions:如果當前數據表是分區表,則表示查詢結果匹配的分區。
(5)type:當前SQL語句所使用的關聯類型或者訪問類型,
其取值從最優到最差依次為
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge> unique_subquery > index_subquery > range > index > ALL
system:查詢的數據表中只有一行數據,是const類型的特例。
const:數據表中最多只有一行數據符合查詢條件,當查詢或連接的字段為主鍵或唯一索引時,則type的取值為const。簡單示例如下:
eq_ref:如果查詢語句中的連接條件或查詢條件使用了主鍵或者非空唯一索引包含的全部字段,則type的取值為eq_ref,典型的場景為使用“=”操作符比較帶索引的列。
ref:當查詢語句中的連接條件或者查詢條件使用的索引不是主鍵和非空唯一索引,或者只是一個索引的一部分,則type的取值為ref,典型的場景為使用“=”帶索引的列。簡單示例如下:
此時,product_order_operate表orderNum字段上添加有普通索引
fulltext:當查詢條件使用了全文索引時,type的取值為fulltext。
ref_or_null:類似于ref,但是當查詢語句的連接條件或者查詢條件包含的列有NULL值時,MySQL會進行額外查詢,經常被用于解析子查詢。簡單示例如下:
index_merge:當查詢語句使用索引合并優化時,type的取值為index_merge。此時,key列會顯示使用到的所有索引,key_len顯示使用到的索引的最長鍵長值。簡單示例如下:
此時,orderNum字段上添加有唯一索引。
unique_subquery:當查詢語句的查詢條件為IN的語句,并且IN語句中的查詢字段為數據表的主鍵或者非空唯一索引字段時,type的取值為unique_subquery。
index_subquery:與unique_subquery類似,但是IN語句中的查詢字段為數據表中的非唯一索引字段。
range:當查詢語句的查詢條件為某個范圍的記錄時,type的取值為range。key列會顯示使用的索引,key_len顯示使用索引的最長鍵長值。典型的場景為使用=、<>、>、>=、<、<=、IS [NOT] NULL、<=>、BETWEEN AND或者IN操作符時,用常量比較關鍵字的列。簡單示例如下:
index:當查詢語句中的查詢條件使用的是覆蓋索引,也就是說查詢條件中的字段包含索引中的全部字段,并且按照索引中字段的順序進行條件匹配,此時只需要掃描索引樹即可。另外,當查詢語句的條件只是按照索引順序查找數據行時,也只需要掃描索引樹即可。簡單示例如下:
ALL:每次進行連接查詢時,都會進行完整的表掃描。查詢性能最差,需要添加索引來避免此類型的查詢。簡單示例如下:
(6)possible_keys:執行查詢語句時可能用到的索引,但是在實際查詢中未必會用到。當此列為NULL時,說明沒有可使用的索引,此時可以通過建立索引來提高查詢的性能。
(7)key:執行查詢語句時MySQL實際會使用到的索引。如果MySQL實際沒有使用索引,則此列為NULL。
(8)key_len:執行查詢語句時實際用到的索引按照字節計算的長度值,可以通過此字段計算MySQL實際上使用了復合索引中的多少字段。如果key列值為NULL,則key_len列值也為NULL。
(9)ref:數據表中的哪個列或者哪個常量用來和key列中的索引做比較來檢索數據。如果此列的值為func,則說明使用了某些函數的結果數據與key列中的索引做比較來檢索數據。
(10)rows:查詢數據時必須查找的數據行數,當數據表的存儲引擎為InnoDB時,值為MySQL的預估值。
(11)Extra:在執行查詢語句時額外的詳細信息。EXPLAIN語句支持使用JSON格式輸出結果信息,例如:
using filesort(性能非常差):說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序稱為文件排序。
using temporary(性能非常差):新建了內部臨時表,使用了臨時表保存中間結果。常見于order by、group by,所以分組和排序一定要按照鎖建立的索引的名字和順序。
總結
以上是生活随笔為你收集整理的mysql数据库关键字及用法_mysql唯一索引关键字(关系型数据库管理系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ceph linux内核配置,cento
- 下一篇: 后端框架有哪些?8个流行的后端框架推荐