一、索引結構
索引有好多資料結構,根據索引的資料結構分為btree索引、hash索引、full-text全文索引、r-tree索引。
下面來看乙個b樹索引結構
【初始化介紹】
一顆b+樹,淺藍色的塊我們稱之為乙個磁碟塊,可以看到每個磁碟塊包含幾個資料項(深藍色所示)和指標(黃色所示),
如磁碟塊1包含資料項17和35,包含指標p1、p2、p3,
p1表示小於17的磁碟塊,p2表示在17和35之間的磁碟塊,p3表示大於35的磁碟塊。
真實的資料存在於葉子節點
即3、5、9、10、13、15、28、29、36、60、75、79、90、99。
非葉子節點只不儲存真實的資料,只儲存指引搜尋方向的資料項,如17、35並不真實存在於資料表中。
【查詢過程】
如果要查詢資料項29,那麼首先會把磁碟塊1由磁碟載入到記憶體,此時發生一次io,在記憶體中用二分查詢確定29在17和35之間,鎖定磁碟塊1的p2指標,記憶體時間因為非常短(相比磁碟的io)可以忽略不計,通過磁碟塊1的p2指標的磁碟位址把磁碟塊3由磁碟載入到記憶體,發生第二次io,29在26和30之間,鎖定磁碟塊3的p2指標,通過指標載入磁碟塊8到記憶體,發生第三次io,同時記憶體中做二分查詢找到29,結束查詢,總計三次io。
真實的情況是,3層的b+
樹可以表示上百萬的資料,如果上百萬的資料查詢只需要三次io,效能提高將是巨大的,如果沒有索引,每個資料項都要發生一次io,那麼總共需要百萬次的io,顯然成本非常非常高。
二、索引建立原則
同乙個時間段,只能載入一種索引驅動,一張表最好不要超過5個索引
【需要建立索引情況】
主鍵自動建立唯一索引
頻繁作為查詢條件的字段
查詢中與其它表關聯的字段,外來鍵關係建立索引
高併發下傾向建立組合索引
查詢中排序的字段,排序欄位若通過索引去訪問將大大提高排序速度
查詢中統計或者分組字段
【不需要建立索引情況】
頻繁更新的字段不適合建立索引
where條件裡用不到的字段不建立索引
表記錄太少
經常增刪改的表
資料重複且分布平均的表字段,如果某個資料列包含許多重複的內容,為它建立索引就沒有太大的實際效果
【總結】
應該只為最經常查詢和最經常排序的資料列建立索引。
MySql 建立索引原則
為了使索引的使用效率更高,在建立索引時,必須考慮在哪些欄位上建立索引和建立什麼型別的索引。本小節將向讀者介紹一些索引的設計原則。1 選擇唯一性索引 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學生的資訊。...
Mysql索引建立原則
在mysql中使用索引的原則有以下幾點 1 對於查詢頻率高的字段建立索引 2 對排序 分組 聯合查詢頻率高的字段建立索引 3 索引的數目不宜太多 原因 a 每建立乙個索引都會占用相應的物理控制項 b 過多的索引會導致insert update delete語句的執行效率降低 4 若在實際中,需要將多...
MySQL索引建立原則
索引的目的是提公升查詢資料的效率,所以我們建索引的標準應該一切從提公升查詢效率為基準。對於有唯一值的列盡量使用唯一索引 索引長度盡量小一點,長度小的索引可以節省索引空間,也會使查詢的速度得到提公升,因為索引頁只有16k,索引列長度小的話,一頁可以容納更多的資料 太長的列可以選擇部分內容做索引,遵循最...