一、背景
有個朋友問一個問題“能不能幫忙看下const和ref_eq有啥差別,mysql高性能書籍裡面的講得不太明白”。
結合這個具體問題,講解一下這類問題我們該如何解決。
二、過程
2.1 源碼大法
由于mysql源碼貌似不是java寫的,找起來也費勁,源碼大法貌似先不能用,我們先放棄。
2.2 搜尋引擎大法
搜到了一篇類似的部落格
http://www.bubuko.com/infodetail-3091337.htmleq_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_constconst
該表最多有一個比對行, 在查詢開始時讀取。由于隻有一行, 是以該行中列的值可以被優化器的其餘部分視為常量。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