鍍金池/ 問答/數(shù)據(jù)庫/ Mysql里explain中的const 類型究竟是個什么概念,和eq_ref究

Mysql里explain中的const 類型究竟是個什么概念,和eq_ref究竟什么區(qū)別?

const :通常情況下,如果將一個主鍵放置到where后面作為條件查詢,mysql優(yōu)化器就能把這次查詢優(yōu)化轉(zhuǎn)化為一個常量。至于如何轉(zhuǎn)化以及何時轉(zhuǎn)化,這個取決于優(yōu)化器。

這個和eq_ref究竟有何區(qū)別?

回答
編輯回答
萢萢糖

以下全部詳細(xì)解析explain各個屬性含義:

????clipboard.png

????各屬性含義:
????id: 查詢的序列號
????select_type: 查詢的類型,主要是區(qū)別普通查詢和聯(lián)合查詢、子查詢之類的復(fù)雜查詢

  • SIMPLE:查詢中不包含子查詢或者UNION
  • 查詢中若包含任何復(fù)雜的子部分,最外層查詢則被標(biāo)記為:PRIMARY
  • SELECTWHERE列表中包含了子查詢,該子查詢被標(biāo)記為:SUBQUERY

????table: 輸出的行所引用的表
????type: 訪問類型
????clipboard.png

????從左至右,性能由差到好

  1. ALL: 掃描全表
  2. index: 掃描全部索引樹
  3. range: 掃描部分索引,索引范圍掃描,對索引的掃描開始于某一點,返回匹配值域的行,常見于between、<、>等的查詢
  4. ref: 使用非唯一索引或非唯一索引前綴進(jìn)行的查找
    eq_ref和const的區(qū)別:
  5. eq_ref:唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一索引掃描
  6. const, system: 單表中最多有一個匹配行,查詢起來非常迅速,例如根據(jù)主鍵或唯一索引查詢。system是const類型的特例,當(dāng)查詢的表只有一行的情況下, 使用system。
  7. NULL: 不用訪問表或者索引,直接就能得到結(jié)果,如select 1 from test where 1

????possible_keys: 表示查詢時可能使用的索引。如果是空的,沒有相關(guān)的索引。這時要提高性能,可通過檢驗WHERE子句,看是否引用某些字段,或者檢查字段不是適合索引

????key: 顯示MySQL實際決定使用的索引。如果沒有索引被選擇,是NULL

????key_len: 使用到索引字段的長度

????注:key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據(jù)表定義計算而得,不是通過表內(nèi)檢索出的。

????ref: 顯示哪個字段或常數(shù)與key一起被使用

????rows: 這個數(shù)表示mysql要遍歷多少數(shù)據(jù)才能找到,表示MySQL根據(jù)表統(tǒng)計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù),在innodb上可能是不準(zhǔn)確的

????Extra: 執(zhí)行情況的說明和描述。包含不適合在其他列中顯示但十分重要的額外信息。

  1. Using index:表示使用索引,如果只有 Using index,說明他沒有查詢到數(shù)據(jù)表,只用索引表就完成了這個查詢,這個叫覆蓋索引。
  2. Using where:表示條件查詢,如果不讀取表的所有數(shù)據(jù),或不是僅僅通過索引就可以獲取所有需要的數(shù)據(jù),則會出現(xiàn) Using where。
2017年1月21日 16:29
編輯回答
念舊

簡單地說是const是直接按主鍵或唯一鍵讀取,eq_ref用于聯(lián)表查詢的情況,按聯(lián)表的主鍵或唯一鍵聯(lián)合查詢。

下面的內(nèi)容翻譯自官方方檔

const
該表最多有一個匹配行, 在查詢開始時讀取。由于只有一行, 因此該行中列的值可以被優(yōu)化器的其余部分視為常量。const 表非??? 因為它們只讀一次。

const用于將 "主鍵" 或 "唯一" 索引的所有部分與常量值進(jìn)行比較。在下面的查詢中, tbl_name 可以用作 const 表:

SELECT * FROM tbl_name WHERE primary_key=1;

SELECT * FROM tbl_name
  WHERE primary_key_part1=1 AND primary_key_part2=2;

eq_ref

讀取本表中和關(guān)聯(lián)表表中的每行組合成的一行。除 了 system 和 const 類型之外, 這是最好的聯(lián)接類型。當(dāng)連接使用索引的所有部分時, 索引是主鍵或唯一非 NULL 索引時, 將使用該值。
eq_ref 可用于使用 = 運算符比較的索引列。比較值可以是常量或使用此表之前讀取的表中的列的表達(dá)式。在下面的示例中, MySQL 可以使用 eq_ref 連接(join)ref_table來處理:

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;



2017年10月4日 11:59