MySql(一) 淺析MySql索引

湖人總冠軍發表於2018-03-07
1、簡介

      索引在資料庫中用來提高查詢的效率(類似新華字典的偏旁部首檢索),可以避免全表掃描查詢,索引也會佔用資料庫資源,避免濫用。

2、索引建立的原則
  • 較頻繁的作為查詢條件的欄位應該建立索引
  • 唯一性太差的欄位不適合單獨建立索引,即使頻繁作為查詢條件
  • 更新非常頻繁的欄位不適合建立索引(資料庫會將索引資料根據演算法排序,資料量大之後重新排序會佔用過多資源)
  • 用於索引的最好的備選資料列是那些出現在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。
MySql(一) 淺析MySql索引

3、複合索引的建立以及最左字首原則

       唯一性太差又經常作為查詢條件的欄位可以建立複合索引,假設在USER表的name、salary和city資料列上建立了複合索引。索引中的資料行按照name/salary/city次序排列,所以即使你在查詢中只指定了name值,或者指定name和salary值,MySQL也可以使用這個索引。因此,這個索引可以被用於搜尋如下所示的資料列組合:
name,salary,city
name,city
name,salary
name
在實際使用中發現:
MySql(一) 淺析MySql索引MySql(一) 淺析MySql索引

1)2,1也是用到了索引的,這裡可能大家會疑惑違背了最左字首原則。其實這是因為把where後條件反過來變成name='aa' and salary=300得到的查詢結果是一樣的。這時MySql的查詢優化器會判斷這條語句執行效率最高的執行順序,最後生成真正的執行計劃,所以最後MySql會以name='aa' and salary=300這種順序查詢,這就用到了索引。

MySql(一) 淺析MySql索引

2)這兩種情況都用到了索引,似乎有點出乎預料。這裡是因為可以直接從索引裡返回查詢記錄,所以用到了索引全掃描,實際掃描的行數為全部行數。但並沒有進行全表掃描,還是用到了索引。

4、索引型別
  • 唯一索引:不允許兩行具有相同的索引值(主鍵索引是唯一索引的特殊型別)
  • 聚集索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序,每個表只能有一個
  • 非聚集索引:該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。 索引是通過二叉樹的資料結構來描述的,可以理解為聚集索引的葉節點就是資料節點。而非聚集索引的葉節點仍然是索引節點,只不過有一個指標指向對應的資料塊。
5、執行計劃explain中type型別
  • null: MySQL不訪問任何表或索引,直接返回結果
  • ALL:全表掃描
  • index: 索引全掃描
  • range: 索引範圍掃描,用於<,<=,>=,between等操作
  • ref: 使用非唯一索引掃描或唯一索引字首掃描,常出現在關聯查詢中
  • eq_ref : 類似ref,區別在於使用的是唯一索引,使用主鍵的關聯查詢
  • const:使用主鍵查詢時出現,代表系統會把匹配行中的其他列作為常數處理(最優情況)



寫部落格是為了加深自己的一些理解,如果有錯誤的地方歡迎指正,大家互相交流。複製程式碼


相關文章