問題:請講下mysql中的索引
分析:mysql中有很多索引,要對對這些索引有所掌握,還要弄清楚每種索引的本質?
回答要點:
主要從以下幾點去考慮
1、索引的本質是什麼
2、mysql的索引分類;
3、每種分類的依據;
mysql在日常的開發中使用非常廣泛,經常會提到的一句是在進行優化的時候,要對索引進行優化,那麼到達什麼是索引那。
索引其實是一種資料結構,建立索引的目的是為了提高查詢效率。如果沒有索引那麼儲存在磁碟中的資料(mysql中的資料歸根結底是儲存在磁碟中的),就需要掃描磁碟,把磁碟中的資料挨個掃描並進行比較,判斷是否為需要的資料,為了提高查詢的效率,增加一個索引的資料結構,在查詢資料的時候先通過讀取索引,找到要查詢資料的主鍵或資料地址,然後根據找到的主鍵或資料地址去硬碟定位資料,這樣比直接掃描磁碟要快很多。
mysql中,myIsam和nnodb兩種資料引擎,底層的索引結構都是B+樹。
從資料和索引是否在一起可以分為聚集索引和非聚集索引。
聚集索引
聚集索引,索引記錄和資料儲存在一起,inndob引擎下的主鍵索引便是聚集索引,其索引樹的葉子節點儲存的是主鍵和對應的行記錄
非聚集索引
非聚集索引,當時是索引記錄和資料是分開儲存的,myIsam引擎下的索引都是非聚集索引,其索引樹的葉子節點儲存的是索引列和對應資料行的地址;要查詢資料首先通過索引樹找到對應的資料地址,然後根據地址進行查詢;
innodb下的非主鍵索引不嚴格意義上來說也可以算作非聚集索引,因為非主鍵索引的葉子節點儲存的是索引列和主鍵值,這裡的主鍵值可以看作是資料地址;
從索引列是否為主鍵可以分為主鍵索引和普通索引
主鍵索引
主鍵索引,以主鍵建立的索引樹,在inndob下必須要有主鍵索引,也就是必須要有主鍵,在建表時最好設定主鍵,在不設定主鍵的情況下,mysql會選擇一個唯一性的列作為主鍵,如果沒有唯一列則會預設生成一個自增的row_id作為主鍵,也就是說inndob的表肯定有主鍵索引,因為主鍵索引的葉子節點儲存的是對應的行記錄且僅有一份,沒有主鍵索引就沒有資料。
普通索引
普通索引,非主鍵的索引都叫普通索引,可以分為單列索引和聯合索引(多列索引),單列索引就是一個列建立的索引;聯合索引就是多個列組成的索引,聯合索引就涉及索引的最左匹配原則。普通索引的葉子節點儲存的是索引列和對應的主鍵值。在命中普通索引的情況下,找到主鍵值後,需要根據主鍵值再查詢主鍵索引方可查詢到對應的資料,而命中主鍵索引時則可以直接查詢到資料,所以主鍵索引查詢效率一般較高。
上面說到了索引的分類及優點,最大的優點就是提高查詢效率,但也不是索引越多越好,因為索引作為一種資料結構也是要佔磁碟空間的,在更新、插入、刪除資料的同時也要維護索引結構會耗費時間,不能為了提高查詢效率而犧牲更新操作的效率,需要合理的設定每張表的索引數量,一般5--6個為最好。