数据库索引类型及实现方式
1、索引定義
數(shù)據(jù)庫索引好比是一本書前面的目錄,能加快數(shù)據(jù)庫的查詢速度。索引是對數(shù)據(jù)庫表中一個或多個列(例如,employee 表的姓氏 (lname) 列)的值進行排序的結(jié)構(gòu)。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。
2、建立索引的優(yōu)缺點:
優(yōu)點:
1.大大加快數(shù)據(jù)的檢索速度。
2.創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
3.加速表和表之間的連接。
4.在使用分組和排序子句進行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間。
缺點:
1.索引需要占用數(shù)據(jù)表以外的物理存儲空間。
2.創(chuàng)建索引和維護索引要花費一定的時間。
3.當對表進行更新操作時,索引需要被重建,這樣降低了數(shù)據(jù)的維護速度。
3、索引類型
根據(jù)數(shù)據(jù)庫的功能,可以在數(shù)據(jù)庫設(shè)計器中創(chuàng)建索引:唯一索引、主鍵索引和聚集索引。 盡管唯一索引有助于定位信息,但為獲得最佳性能結(jié)果,建議改用主鍵或唯一約束。
唯一索引: UNIQUE
例如:create unique index stusno on student(sno);
表明此索引的每一個索引值只對應(yīng)唯一的數(shù)據(jù)記錄,對于單列惟一性索引,這保證單列不包含重復(fù)的值。對于多列惟一性索引,保證多個值的組合不重復(fù)。
主鍵索引: primary key
數(shù)據(jù)庫表經(jīng)常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。 在數(shù)據(jù)庫關(guān)系圖中為表定義主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數(shù)據(jù)的快速訪問。
聚集索引(也叫聚簇索引):cluster
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。 如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度。
4、索引的實現(xiàn)方式
1 B+樹
我們經(jīng)常聽到B+樹就是這個概念,用這個樹的目的和紅黑樹差不多,也是為了盡量保持樹的平衡,當然紅黑樹是二叉樹,但B+樹就不是二叉樹了,節(jié)點下面可以有多個子節(jié)點,數(shù)據(jù)庫開發(fā)商會設(shè)置子節(jié)點數(shù)的一個最大值,這個值不會太小,所以B+樹一般來說比較矮胖,而紅黑樹就比較瘦高了。
關(guān)于B+樹的插入,刪除,會涉及到一些算法以保持樹的平衡,這里就不詳述了。ORACLE的默認索引就是這種結(jié)構(gòu)的。
如果經(jīng)常需要同時對兩個字段進行AND查詢,那么使用兩個單獨索引不如建立一個復(fù)合索引,因為兩個單獨索引通常數(shù)據(jù)庫只能使用其中一個,而使用復(fù)合索引因為索引本身就對應(yīng)到兩個字段上的,效率會有很大提高。
2 散列索引
第二種索引叫做散列索引,就是通過散列函數(shù)來定位的一種索引,不過很少有單獨使用散列索引的,反而是散列文件組織用的比較多。
散列文件組織就是根據(jù)一個鍵通過散列計算把對應(yīng)的記錄都放到同一個槽中,這樣的話相同的鍵值對應(yīng)的記錄就一定是放在同一個文件里了,也就減少了文件讀取的次數(shù),提高了效率。
散列索引呢就是根據(jù)對應(yīng)鍵的散列碼來找到最終的索引項的技術(shù),其實和B樹就差不多了,也就是一種索引之上的二級輔助索引,我理解散列索引都是二級或更高級的稀疏索引,否則桶就太多了,效率也不會很高。
3 位圖索引
位圖索引是一種針對多個字段的簡單查詢設(shè)計一種特殊的索引,適用范圍比較小,只適用于字段值固定并且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態(tài)等等,并且只有在同時對多個這樣的字段查詢時才能體現(xiàn)出位圖的優(yōu)勢。
位圖的基本思想就是對每一個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那么如果使用位圖索引就會建立兩個位圖,對應(yīng)男的10110和對應(yīng)女的01001,這樣做有什么好處呢,就是如果同時對多個這種類型的字段進行and或or查詢時,可以使用按位與和按位或來直接得到結(jié)果了。
B+樹最常用,性能也不差,用于范圍查詢和單值查詢都可以。特別是范圍查詢,非得用B+樹這種順序的才可以了。
HASH的如果只是對單值查詢的話速度會比B+樹快一點,但是ORACLE好像不支持HASH索引,只支持HASH表空間。
位圖的使用情況很局限,只有很少的情況才能用,一定要確定真正適合使用這種索引才用(值的類型很少并且需要復(fù)合查詢),否則建立一大堆位圖就一點意義都沒有了。
5、額外知識
(1)、varchar,varchar(2),char的區(qū)別
1.char的長度是固定的,而varchar2的長度是可以變化的, 比如,存儲字符串“abc",對于char(10),表示你存儲的字符將占10個字節(jié)(包括7個空字符),而同樣的varchar2(10)則只占用3個字節(jié)的長度,10只是最大值,當你存儲的字符小于10時,按實際長度存儲。
2.char的效率比varchar2的效率稍高。
3.目前varchar是varchar2的同義詞。工業(yè)標準的varchar類型可以存儲空字符串,但是Oracle不這樣做,盡管它保留以后這樣做的權(quán)利。Oracle自己開發(fā)了一個數(shù)據(jù)類型varchar2,這個類型不是一個標準的varchar,它將在數(shù)據(jù)庫中varchar列可以存儲空字符串的特性改為存儲NULL值。如果你想有向后兼容的能力,Oracle建議使用varchar2而不是varchar。
(2)、何時該用char,何時該用varchar2?
char與varchar2是一對矛盾的統(tǒng)一體,兩者是互補的關(guān)系.
varchar2比char節(jié)省空間,在效率上比char會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在數(shù)據(jù)庫設(shè)計上常說的 ‘以空間換效率’。
varchar2雖然比char節(jié)省空間,但是如果一個varchar2列經(jīng)常被修改,而且每次被修改的數(shù)據(jù)的長度不同,這會引起‘行遷移’(Row Migration)現(xiàn)象,而這造成多余的I/O,是數(shù)據(jù)庫設(shè)計和調(diào)整中要盡力避免的,在這種情況下用char代替varchar2會更好一些。
(3)、行遷移和行鏈接
行連接是指一個行存儲在多個塊中的情況,因為一個該行的長度超過了一個塊的可用空間大小。
行遷移是指一個數(shù)據(jù)行不適合放入當前塊而被重新定位到另一個塊,但在原始塊中保留一個指針,原始塊中的指針是必需的,因為索引的rowid項仍然指向原始位置.
行連接通常與行的長度和Oracle數(shù)據(jù)庫塊中的大小有關(guān),而行遷移通常是當一個更新操作的長度增加且又要保持該行在同一塊中,而該塊又缺少可用空間時產(chǎn)生的問題,Oracle在決定行連接之前先試圖進行行遷移。
部分轉(zhuǎn)載于:BarryWang
總結(jié)
以上是生活随笔為你收集整理的数据库索引类型及实现方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称起亚将在韩国建设第二个 PBV 工
- 下一篇: 词法分析(NFA与DFA)