索引(Index)是幫助MySQL高效獲取數據的數據結構。索引的本質:索引是數據結構。
可以簡單理解為“排好序的快速查找數據結構”,在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些 數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。
一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上。
我們平常所說的索引,如果沒有特別指明,都是指B樹(多路搜索樹,并不一定是二叉樹)結構組織的索引。其中聚集索引,次要索引,覆蓋索引, 復合索引,前綴索引,唯一索引默認都是使用B+樹索引,統稱索引。當然,除了B+樹這種類型的索引之外,還有哈希索引(hashindex)等。
優勢: 1、提高了數據檢索的效率,降低了數據庫的IO成本 2、通過索引列對數據進行排序,降低數據排序的成本,降低了CPU的消耗。
劣勢: 實際上索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄,所以索引列也是要占用空間的。 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert、update、delete。 因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件,每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息。 索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立最優秀的索引。
索引分類:
單值索引:即一個索引只包含單個列,一個表可以有多個單列索引。
唯一索引:索引列的值必須唯一,但允許有空值
復合索引:
那些情況下需要建立索引:
1、主鍵自動建立唯一索引
2、頻繁作為查詢條件的字段應該創建索引
3、查詢中與其他表關聯的字段,外鍵關系建立索引
4、頻繁更新的字段不適合創建索引
5、where條件里用不到的字段不創建索引
6、單鍵/組合索引的選擇問題:在高并發下傾向創建組合索引
7、查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
8、查詢中統計或者分組字段
哪些情況下不需要建立索引:
1、表記錄太少
2、經常增、刪、改的表
3、
新聞熱點
疑難解答