MySql(一) 淺析MySql索引

一、簡介

      索引在數據庫中用來提升查詢的效率(相似新華字典的偏旁部首檢索),能夠避免全表掃描查詢,索引也會佔用數據庫資源,避免濫用。算法

二、索引創建的原則
  • 較頻繁的做爲查詢條件的字段應該建立索引
  • 惟一性太差的字段不適合單首創建索引,即便頻繁做爲查詢條件
  • 更新很是頻繁的字段不適合建立索引(數據庫會將索引數據根據算法排序,數據量大以後從新排序會佔用過多資源)
  • 用於索引的最好的備選數據列是那些出如今WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。

三、複合索引的創建以及最左前綴原則
數據庫

       惟一性太差又常常做爲查詢條件的字段能夠創建複合索引,假設在USER表的name、salary和city數據列上創建了複合索引。索引中的數據行按照name/salary/city次序排列,因此即便你在查詢中只指定了name值,或者指定name和salary值,MySQL也可使用這個索引。所以,這個索引能夠被用於搜索以下所示的數據列組合:
name,salary,city
name,city
name,salary
name
在實際使用中發現:

1)2,1也是用到了索引的,這裏可能你們會疑惑違背了最左前綴原則。其實這是由於把where後條件反過來變成name='aa' and salary=300獲得的查詢結果是同樣的。這時MySql的查詢優化器會判斷這條語句執行效率最高的執行順序,最後生成真正的執行計劃,因此最後MySql會以name='aa' and salary=300這種順序查詢,這就用到了索引。bash

2)這兩種狀況都用到了索引,彷佛有點出乎預料。這裏是由於能夠直接從索引裏返回查詢記錄,因此用到了索引全掃描,實際掃描的行數爲所有行數。但並無進行全表掃描,仍是用到了索引。數據結構

四、索引類型
  • 惟一索引:不容許兩行具備相同的索引值(主鍵索引是惟一索引的特殊類型)
  • 彙集索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序,每一個表只能有一個
  • 非彙集索引:該索引中索引的邏輯順序與磁盤上行的物理存儲順序不一樣。 索引是經過二叉樹的數據結構來描述的,能夠理解爲彙集索引的葉節點就是數據節點。而非彙集索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
五、執行計劃explain中type類型
  • null: MySQL不訪問任何表或索引,直接返回結果
  • ALL:全表掃描
  • index: 索引全掃描
  • range: 索引範圍掃描,用於<,<=,>=,between等操做
  • ref: 使用非惟一索引掃描或惟一索引前綴掃描,常出如今關聯查詢中
  • eq_ref : 相似ref,區別在於使用的是惟一索引,使用主鍵的關聯查詢
  • const:使用主鍵查詢時出現,表明系統會把匹配行中的其餘列做爲常數處理(最優狀況)



寫博客是爲了加深本身的一些理解,若是有錯誤的地方歡迎指正,你們互相交流。複製代碼
相關文章
相關標籤/搜索