天天看點

找到某個技術點答案的正确姿勢以const和ref_eq差別為例

一、背景

有個朋友問一個問題“能不能幫忙看下const和ref_eq有啥差別,mysql高性能書籍裡面的講得不太明白”。

結合這個具體問題,講解一下這類問題我們該如何解決。

二、過程

2.1 源碼大法

由于mysql源碼貌似不是java寫的,找起來也費勁,源碼大法貌似先不能用,我們先放棄。

2.2 搜尋引擎大法

搜到了一篇類似的部落格

http://www.bubuko.com/infodetail-3091337.html

eq_ref: 唯一性索引掃描,對于每個索引鍵,表中隻有一條記錄與之比對,常見主鍵或者唯一索引掃描

 const: 表示通過索引一次就找到了,const用于比較primary_key和union,由于隻比對一條資料,是以很快,

找了很多這類部落格,貌似講得也不太清楚

或者StackOverFlow上查詢,不過沒發現好的解釋。

2.3 翻書大法

找相關的比較經典的權威的圖書。

比如我們找《MySQL深度剖析》,沒有找到特别通俗的解釋,放棄。

2.4 指令help大法

找了半天沒找到類似 mysql explain --help這種指令,放棄。

如果有幫助指令,一般解釋非常權威和詳細。

2.5 官方文檔大法

其實很多文章都是根據官方的文檔自己翻譯過來的,或者根據官方文檔寫的書,或者根據别人的了解寫的文章。

是以看源碼和看官方文檔更權威。

我們找到了對應的文檔:

https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#jointype_const

const

該表最多有一個比對行, 在查詢開始時讀取。由于隻有一行, 是以該行中列的值可以被優化器的其餘部分視為常量。const 表非常快, 因為它們隻讀一次。

const用于将 "主鍵" 或 "唯一" 索引的所有部分與常量值進行比較。

這裡的表述都是“an table”,而且示例也是單表,是以應該隻在單表查詢時。

https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#jointype_eq_ref

讀取本表中和關聯表表中的每行組合成的一行。除 了 system 和 const 類型之外, 這是最好的聯接類型。當連接配接使用索引的所有部分時, 索引是主鍵或唯一非 NULL 索引時, 将使用該值。

eq_ref 可用于使用 = 運算符比較的索引列。比較值可以是常量或使用此表之前讀取的表中的列的表達式。通常用在多表查詢中。

這裡總是提到"tables",且示例都是多個表,用在多表查詢時。

三、learn more

另外跟據我們的learn more的習慣,我們可以去mysql官方文檔中找到其他類型的詳細說明和示例,系統掌握相關知識點。

這樣我們遇到一個點不會的,我們就把整條線都掌握了。

我們還可以了解他們之間的好壞排序

type顯示的是通路類型,是較為重要的一個名額,結果值從好到壞依次是:system > const > eq_ref> ref> fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index>all,一般來說,得保證查詢至少達到range級别,最好能達到ref。

甚至可以看官方文檔的其他章節内容。

四、demo大法

根據官方文檔的解釋,建立一個表去驗證。動動手,印象更深刻。

此處略掉。

五、通法

這類問題,可以參考第二部分的幾個步驟來解決。

源碼,搜尋引擎,翻書,指令幫助,官方文檔,寫demo驗證等幾個角度去找到想要的答案。

創作不易,如果覺得本文對你有幫助,歡迎點贊,歡迎關注我,如果有補充歡迎評論交流,我将努力創作更多更好的文章。

————————————————

版權聲明:本文為CSDN部落客「明明如月學長」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:

https://blog.csdn.net/w605283073/article/details/92254309