1、索引定義資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。
索引是對資料庫表中乙個或多個列(例如,employee 表的姓氏 (lname) 列)的值進行排序的結構。如果想按特定職員的姓來查詢他或她,則與在表中搜尋所有的行相比,索引有助於更快地獲取資訊。
2、建立索引的優缺點:
優點:1.大大加快資料的檢索速度;
2.建立唯一性索引,保證資料庫表中每一行資料的唯一性;
3.加速表和表之間的連線;
4.在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。
缺點:1.索引需要占用資料表以外的物理儲存空間
2.建立索引和維護索引要花費一定的時間
3.當對表進行更新操作時,索引需要被重建,這樣降低了資料的維護速度。
3、索引型別:根據資料庫的功能,可以在資料庫設計器中建立索引:唯一索引、主鍵索引和聚集索引。 儘管唯一索引有助於定位資訊,但為獲得最佳效能結果,建議改用主鍵或唯一約束。
唯一索引: unique 例如:create unique index stusno on student(sno);
表明此索引的每乙個索引值只對應唯一的資料記錄,
對於單列惟一性索引,這保證單列不包含重複的值。對於多列惟一性索引,保證多個值的組合不重複。
主鍵索引: primary key
資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。 在資料庫關係圖中為表定義
主鍵將自動建立主鍵索引
,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。
聚集索引(也叫聚簇索引):cluster
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能包含乙個聚集索引。 如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。
4、索引的實現方式
1 b+樹我們經常聽到b+樹就是這個概念,用這個樹的目的和紅黑樹差不多,也是為了盡量保持樹的平衡,當然紅黑樹是二叉樹,但b+樹就不是二叉樹了,節點下面可以有多個子節點,資料庫開發商會設定子節點數的乙個最大值,這個值不會太小,所以b+樹一般來說比較矮胖,而紅黑樹就比較瘦高了。
關於b+樹的插入,刪除,會涉及到一些演算法以保持樹的平衡,這裡就不詳述了。oracle的預設索引就是這種結構的。
如果經常需要同時對兩個字段進行and查詢,那麼使用兩個單獨索引不如建立乙個復合索引,因為兩個單獨索引通常資料庫只能使用其中乙個,而使用復合索引因為索引本身就對應到兩個欄位上的,效率會有很大提高。
2 雜湊索引
第二種索引叫做雜湊索引,就是通過雜湊函式來定位的一種索引,不過很少有單獨使用雜湊索引的,反而是雜湊檔案組織用的比較多。
雜湊檔案組織就是根據乙個鍵通過雜湊計算把對應的記錄都放到同乙個槽中,這樣的話相同的鍵值對應的記錄就一定是放在同乙個檔案裡了,也就減少了檔案讀取的次數,提高了效率。
雜湊索引呢就是根據對應鍵的雜湊碼來找到最終的索引項的技術,其實和b樹就差不多了,也就是一種索引之上的二級輔助索引,我理解雜湊索引都是二級或更高階的稀疏索引,否則桶就太多了,效率也不會很高。
3 位圖索引
位圖索引是一種針對多個欄位的簡單查詢設計一種特殊的索引,適用範圍比較小,只適用於字段值固定並且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態等等,並且只有在同時對多個這樣的字段查詢時才能體現出位圖的優勢。
點陣圖的基本思想就是對每乙個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那麼如果使用位圖索引就會建立兩個位圖,對應男的10110和對應女的01001,這樣做有什麼好處呢,就是如果同時對多個這種型別的字段進行and或or查詢時,可以使用按位與和按位或來直接得到結果了。
b+樹最常用,效能也不差,用於範圍查詢和單值查詢都可以。特別是範圍查詢,非得用b+樹這種順序的才可以了。
hash的如果只是對單值查詢的話速度會比b+樹快一點,但是oracle好像不支援hash索引,只支援hash表空間。
點陣圖的使用情況很侷限,只有很少的情況才能用,一定要確定真正適合使用這種索引才用(值的型別很少並且需要復合查詢),否則建立一大堆點陣圖就一點意義都沒有了。
hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b-tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以hash索引的查詢效率要遠高於b-tree索引。
可能很多人又有疑問了,既然hash索引的效率要比b-tree高很多,為什麼大家不都用hash索引而還要使用b-tree索引呢?任何事物都是有兩面性的,hash索引也一樣,雖然hash索引效率高,但是hash索引本身由於其特殊性也帶來了很多限制和弊端,主要有以下這些。
(1)hash索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。
由於hash索引比較的是進行hash運算之後的hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的hash演算法處理之後的hash值的大小關係,並不能保證和hash運算前完全一樣。
(2)hash索引無法被用來避免資料的排序操作。
由於hash索引中存放的是經過hash計算之後的hash值,而且hash值的大小關係並不一定和hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;
(3)hash索引不能利用部分索引鍵查詢。
對於組合索引,hash索引在計算hash值的時候是組合索引鍵合併後再一起計算hash值,而不是單獨計算hash值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash索引也無法被利用。
(4)hash索引在任何時候都不能避免表掃瞄。
前面已經知道,hash索引是將索引鍵通過hash運算之後,將 hash運算結果的hash值和所對應的行指標資訊存放於乙個hash表中,由於不同索引鍵存在相同hash值,所以即使取滿足某個hash鍵值的資料的記錄條數,也無法從hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。
(5)hash索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高。
對於選擇性比較低的索引鍵,如果建立hash索引,那麼將會存在大量記錄指標資訊存於同乙個hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...