一. 按存儲結構分
a. b樹索引 默認索引
? 即二叉搜索樹:
?????? 1.所有非葉子結點至多擁有兩個兒子(Left和Right)
2.所有結點存儲一個 關鍵字 ;
?????? 3.非葉子結點的左指針指向小于其關鍵字的子樹,右指針指向大于其關鍵字的子樹;
?????? 如:
?B樹的搜索,從 根結點 開始,如果查詢的關鍵字與結點的關鍵字相等,那么就命中;
否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入
右兒子;如果左兒子或右兒子的指針為空,則報告找不到相應的關鍵字;
?????? ?如果B樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那么B樹
的搜索性能逼近 二分查找 ;但它比連續內存空間的二分查找的優點是,改變B 樹結構
(插入與刪除結點)不需要移動大段的內存數據,甚至通常是 常數 開銷;
?????? 如:
但B樹在經過多次插入與刪除后,有可能導致不同的結構:
?? 右邊也是一個B樹,但它的搜索性能已經是 線性 的了;同樣的關鍵字集合有可能導致不同的
樹結構索引;所以,使用B樹還要考慮盡可能讓B樹保持左圖的結構,和避免右圖的結構,也就
是所謂的“平衡”問題;??????
?????? 實際使用的B樹都是在原B樹的基礎上加上平衡算法,即“ 平衡二叉樹 ”;如何保持B樹
結點分布均勻的平衡算法是平衡 二叉樹 的關鍵;平衡算法是一種在B樹中插入和刪除結點的策略;
b. 位圖索引
如有表 test(id,name,address)
數據
(1,張三,大連)
(2,李四,天津)
(3,王五,北京)
(4,趙六,大連)
....
類似這樣的數據,如果查詢的時候用到 【where address='大連'】,因為數據庫中有很多這樣的數據,所以一般的索引起不到查詢加速的作用,而建立位圖索引后會產生如下位圖效果:
假設有4條數據(就如上所示)
大連 天津? 北京
1??? 0???? 0
0??? 1???? 0
0??? 0???? 1
1??? 0???? 0
這樣當查詢:
select * from 表 where address='大連' or address='北京';
的時候數據庫很快就能根據 同行的 1和0 判斷出那一條數據符合要求。
在實際應用中,如果某個字段的值需要頻繁更新,那么就不適合在它上面創建位圖索引。
在位圖索引中,如果你更新或插入其中一條數值為N的記錄,
???? 那么相應表中數值為N的記錄(可能成百上千條)全部被Oracle鎖定,
???? 這就意味著其它用戶不能同時更新這些數值為N的記錄,其它用戶必須要等第一個用戶提交后,
???? 才能獲得鎖,更新或插入數據,bitmap index它主要用于決策支持系統或靜態數據。
?
c. 反向鍵索引
我們知道Oracle會自動為表的主鍵列建立索引,這個默認的索引是普通的B-Tree索引。對于主鍵值是按順序(遞增或遞減)加入的情況,默認的B- Tree索引并不理想。這是因為如果索引列的值具有嚴格順序時,隨著數據行的插入,索引樹的層級增長很快。搜索索引發生的I/O讀寫次數和索引樹的層級數成正比,也就是說,一棵具有5個層級的B-Tree索引,在最終讀取到索引數據時最多可能發生多達5次I/O操作。因而,減少索引的層級數是索引性能調整的一個重要方法。
如果索引列的數據以嚴格的有序的方式插入,那么B-Tree索引樹將變成一棵不對稱的"歪樹",
而如果索引列的數據以隨機值的方式插入,我們將得到一棵趨向對稱的索引樹,
對稱的B-Tree索引
搜索到A塊需要進行5次I/O操作,而圖 6僅需要3次I/O操作。
既然索引列數據從序列中獲取,其有序性無法規避,但在建立索引時,Oracle允許對索引列的值進行反向,即預先對列值進行比特位的反向,如 1000,10001,10011,10111,1100經過反向后的值將是0001,1001,1101,0011。顯然經過位反向處理的有序數據變得比較隨機了,這樣所得到的索引樹就比較對稱,從而提高表的查詢性能。
但反向鍵索引也有它局限性:如果在WHERE語句中,需要對索引列的值進行范圍性的搜索,如BETWEEN、<、>等,其反向鍵索引無法使用,此時,Oracle將執行全表掃描;只有對反向鍵索引列進行 <> 和 = 的比較操作時,其反向鍵索引才會得到使用。
?
二. 按索引值分
a. 唯一索引
列上的值是唯一的,主鍵為唯一索引
b. 非唯一索引
在列上的值可以為null
三. 其它索引
a. 單列索引
一個列建索引
b. 組合索引
多個列一起建索引
c. 基于函數索引
? 使用函數里面的表達式來索引
?
能用唯一索引,一定用唯一索引
能加非空,就加非空約束
一定要統計表的信息,索引的信息,柱狀圖的信息。
聯合索引的順序不同,影響索引的選擇,盡量將值少的放在前面
只有做到以上四點,數據庫才會正確的選擇執行計劃。
?
四: 創建語法
create unique|bitmap index 索引名稱
on 表名
(列1 asc|desc?,列2.。。。)
reverse
reverse 為反向鍵索引,unique唯一和bitmap位置不寫為b樹索引
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
