資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢、更新表中的資料;
即:在資料之外,資料庫維護著滿足特定演算法的資料結構,這些資料結構以某種方式引用資料,這樣就能在這些資料結構上實現高階查詢演算法,這樣的資料結構就是索引;
為表建立索引也是有代價的,索引需要占用額外的儲存空間以及更新資料的同時可能要更新索引;
如圖:若需要加快第二列的查詢速度,例如(select col1,col2 from table_name where col2 = 22),在沒有索引的情況下,資料庫管理系統只能順序搜尋,時間複雜度為o(n),這在有著海量資料的資料庫內很難實現;在建立索引之後,我們通過搜尋索引的這棵二叉搜尋樹來找到對應資料的位址,這樣我們能在log2(n)下查詢資料;
根據資料庫的功能,索引的種類主要有三種:唯一索引,主鍵索引,聚集索引;
唯一索引:不允許任意兩行的索引值相同,例如:在表中員工姓名列上建立唯一索引之後,公司不能有同姓名的員工;
主鍵索引:資料庫中有一列,用於唯一的標識資料庫中的每一行,該列被稱為主鍵,在查詢中使用主鍵,能允許主鍵對資料的快速訪問;
聚集索引:在聚集索引中,表中行的物理順序與鍵值的索引順序相同,乙個表只能包含乙個聚集索引;
資料庫占用空間巨大,一般存在於磁碟中,磁碟在每次讀取資料時,會從這個位置開始,將後面的一部分資料也讀進記憶體,這就是磁碟預讀,依據了電腦科學裡的區域性性原理:當前資料被訪問,其附近的資料被用到的可能性會很大,作業系統一般將主存和磁碟儲存區分為大小相等的儲存塊,每個儲存塊稱為一頁;
資料庫利用磁碟預讀原理,將每個節點的大小設定為一頁,這樣乙個節點只需要一次i/o;
b-tree中一次檢索,需要h-1次i/o(根節點常駐記憶體);複雜度為o(h)=o(logdn);b-tree的出度d一般非常大,使得樹的深度h很小;而紅黑樹h明顯要深的多,所以效率不及b-tree;
在mysql中使用b+tree,b+樹的所有資料存在葉子節點上,非葉子節點上沒有指向資料的指標,並且將所有葉子節點用乙個鍊錶相連;
所以b+樹有兩種搜尋方法:
1. 與b樹相同,從根節點開始搜尋,都需要走完樹的所有層(b樹不一定);
2. 通過鍊錶順序搜尋;
綜上,建立索引的優點:
1. 通過建立唯一性索引,保證資料庫表中每一行的唯一性;
2. 大大加快對資料的檢索速度,也是建立索引主要的原因;
3. 加速表與表之間的連線;
4. 在使用分組和排序子句進行資料減速時,縮短分組和排序的時間;
索引的缺點:
1. 建立索引和維護索引需要時間與空間;
2. 資料更新時索引也要更新,降低資料更新速度;
我們應該在這些列上建立索引:主鍵列;資料有唯一性的列;經常需要搜尋的列;經常用在連線的列;經常需要通過範圍進行搜尋的列;經常需要排序的列;經常使用在where子句中的列;
我們不應該在這些列上建立索引:在查詢中很少使用到的列;資料值很少的列(如:性別列,婚姻狀況列),這種採用位圖索引效率很高;
對修改效能的要求遠高於檢索效能的列,修改效能與檢索效能是矛盾的;
資料庫索引小結
正文內容本身就是一種按照一定規則排列的目錄稱為 聚集索引 在正文之外建立的目錄稱為 非聚集索引 對於索引的優化,從索引實現本身 1.對於等職查詢使用雜湊結構的索引,對含非等值查詢的使用b樹。2.壓縮索引鍵值,減少索引層數 對於使用者的選擇來說 1.對於查詢乙個範圍的值,或者多個記錄的值時使用聚集索引...
資料庫索引小結
好處 資料庫利用各種各樣的快速定位技術,能夠大大提高查詢效率 索引的建立 1.alter table alter table用來建立普通索引 unique索引或primary key索引 例子 alter table table name add index index name column li...
資料庫小結
在最近做的專案中碰到了資料庫方面的問題,對遇到的問題和處理方法做乙個小總。1.左 右 連線查詢與多變聯合查詢的區別。假定現在有兩張表user info和adviser verify info表,使用者表中user id為10000的使用者在adviser verify info表中可能有對應的記錄,...