數據庫進階(文件的組織方式和索引)

數據庫中文件的組織方式

數據庫的組織要考率更新和檢索的需求,更新涉及到數據的存儲空間的擴展和回收的問題,檢索涉及到掃描整個數據庫,和大批量處理數據的問題,不同的需求要求不同的數據組織方式和存取方式。

數據的組織方法是指數據組成記錄,塊,和訪問結構的方式,包括把記錄和塊存儲在磁盤上的方式,以及塊和記錄之間的相互聯繫。
存取方法是指對文件所採取的存取操作方法。
一種文件組織可以採取多種存取方法進行訪問

無序的文件組織方法(堆文件heap 或pile file)

特點:記錄可以存儲在任意的空間位置,磁盤上的存
儲記錄是無序的,更新效率高,但是檢索效率低。
這裏寫圖片描述
方法一:每一次插入數據都插入到數據的尾部,刪除數據的時候我們將被刪除的記錄做一個標記,不做標記的話會涉及到大規模的數據移動,是不安全的。
方法2:在被標記的基礎上,如果插入數據所佔用的空間小於被標記的空間將新的記錄插入到被標記的記錄處。
但是頻繁的更新數據會造成空間的浪費,導致數據庫性能下降,所以需要週期性重新組織數據庫。即數據庫重組。

有序的文件組織(Sequential file)

特點:記錄按照某個屬性或者屬性組值得順序插入,磁盤上的存儲記錄是有序的,檢索的效率可能高。
用於存儲排序的字段通常稱爲排序字段,排序字段一般使用關係之中的主鍵,又稱爲排序碼當按排序字段檢索的時候檢索的速度會得到提高,但是當按照非排序字段檢索的時候檢索的速度不會提高很多。但是有序的文件組織的更新效率比較低,因爲在插入數據的時候要大規模的移動數據爲插入數據留出空間而且是不安全的。
改進:使用一個臨時無序文件(溢出文件)保留新增記錄。當採取溢出文件的時候檢索既要操作主文件又要操作溢出文件,所以需要週期性的重組數據庫。

散列文件組織(hash file)

特點:將記錄某個屬性或者屬性組值,依據散列函數計算出其應該存放的位置:桶號。檢索的效率和跟新的效率都有一定的提升
用於進行散列函數的屬性或者屬性組的值稱爲散列字段,通常採用
關係中的主碼,也叫散列碼

聚簇文件組織(Clustering file)

聚簇:將具有相同或相似屬性值的記錄存放於連續的磁盤簇塊中。
多表聚簇:將若干相關聯的表存儲在同一個文件中,這樣可以提高多表查尋的速度。

索引

索引是定義在表基礎之上,有助於無需檢查所有記錄而快速定位所需記錄的一種輔助存儲結構,由一系列存儲在磁盤上的索引項組成,每一個索引項又由兩部風構成:
索引字段:由table中的某些列中的值串接而成,索引通常存儲了索引字段的每一個值。類似於字典中的詞條。
行指針:指向table中包含索引字段值的記錄在磁盤上的存儲位置,類似於頁碼。
存儲索引項的文件稱爲索引文件,存儲表稱爲主文件。

優點:
索引是一種輔助存儲結構,不改變存儲表的物理存儲結構,但是可以明顯提高存儲表的訪問速度。索引文件有兩種組織方式:
排序索引文件:按索引字段值的某一種順序組織存儲。
散列索引文件:依據索引字段值使用散列函數分配散列桶的方式存儲

特點:
在一個表上可以針對不同的屬性或屬性組建立不同的索引文件,索引字段的值可以是table中的任何一個屬性的值或任何多個屬性的值。
索引文件要比主文件小很多。索引文件可以直接裝載入內存中,通過檢索索引文件,快速定位後,再有針對的讀取較大的主文件中的相關記錄。但是索引技術雖然使檢索的效率大大提高,但是同時增加了存儲空間,維護負擔(不僅要維護主文件,還要維護索引文件)

衡量索引性能的好壞:
訪問時間
插入時間
刪除時間
空間負載
支持存取的有效性
排序碼:對主文件進行排序存儲的那些屬性或者屬性組
索引碼:即索引字段,不一定具有唯一性
搜索碼:在主文件查找記錄的屬性或屬性集
在DBMS中,當定義了表之後,如果定義了主鍵,系統會自動創建主索引,利用主索引可以對table進行快速的定位,檢索和跟新。
當然用戶也可以自己創建索引和撤銷。DBMS會自動維護所有的索引。當表被刪除之後,定義在表上的索引也會被自動撤銷

創建索引:

create [unique] index indexname on tablename(colname[asc|desc]......)

撤銷索引:

drop index indexname;

稠密索引和稀疏索引

稠密索引:對於主文件中的每一個記錄(形成的每一個索引字段值),都有一個索引項和它對應,之名該記錄所在的位置,
這樣的索引稱爲稠密索引
稀疏索引:對於主文件的部分記錄(形成的索引字段值),有索引項和他對應,這樣的索引稱爲稀疏索引。
這裏寫圖片描述

  • 稀疏索引是如何定位記錄的:
    定位搜索碼值爲K的記錄,找到相鄰的小於K值的最大索引字段值對應的索引項,按照記錄的開始順序檢索。但是要求主文件的對應
    索引字段必須按照字段的屬性排序存儲。
    相對於稠密索引來說,稀疏索引空間佔用更少,維護任務更輕,但是速度較慢。
    假如要查詢Downtown,那麼稀疏索引會先在索引文件中找到Brigthon,再到對應的主文件中按照順序查找記錄。
  • 稠密索引如何查找記錄:
    按候選鍵屬性的稠密索引:主文件的候選鍵是唯一的和索引文件的索引碼是一 一對應的。
    非候選鍵屬性的稠密查找分爲三種情況:
    1.索引文件中的索引碼是不重複的,要求主文件必須按索引字段排序。
    2.索引文件中的索引碼是重複的,直接按對應的關係查詢記錄,不需要排序。
    3.索引文件中的索引碼是不重複的,引入指針桶處理,不需要排序。

主索引和輔助索引

主索引的索引字段值爲塊錨的索引字段值,指針指向其所在的存儲塊,一般使用主碼且基於主碼的排序字段上。主索引的索引碼和主文件的排序碼(主碼)存在對應關係。主索引是稀疏索引
這裏寫圖片描述
輔助索引是定義在主文件的任意一個或多個非排序字段上的輔助存儲結構。屬於稠密索引
區別:
1.一個主文件只能有一個主索引,但是可以有多個輔助索引
2.主索引通常建立在主碼上;輔助索引建立在其他索引上面
3.可以利用主索引重新組織主文件數據,但是輔助索引不能改變主文件數據

B+樹和B樹索引

B+樹索引:當索引項比較多的時候,不能一次裝入內存,可以對索引再建立索引,形成多級索引。
B+樹索引是一種以樹形結構來組織索引項的多級索引。
B+樹的實現方式:B+樹包括了根節點,非頁節點,葉節點。 跟節點和非葉節點的指針指向的是索引項的數據塊,是對索引建立索引。葉子節點的指針指向主文件的數據塊,但是它的最後一個指針指向的是下一個數據塊,是對主文件的索引。
這裏寫圖片描述
B樹索引:B樹是直接對主文件建立索引。
這裏寫圖片描述
在oracle中B樹的指針就是rowid。
不論是B+樹還是B樹節點的分裂(插入)和節點的合併(刪除)算法。是關鍵。

示例:在oracle中常用的索引

  • B樹索引
    B樹一般適用於高基數的字段,即重複值少的字段。
    未建立索引:
-- 在sql plus中打開跟蹤器
SQL> conn sys/change_on_install as sysdba;
已連接。
SQL> set autotrace on;
SQL> select * from c##scott.emp where sal>1500;

這裏寫圖片描述

未對搜索碼建立索引,進行了全表掃描。
建立B樹索引後:

create index emp_sal_index on c##scott.emp(sal);

這裏寫圖片描述

  • 位圖索引
    適用於基數小的字段
    假如要查詢部門編號爲10的僱員,但是部門編號只有10,20,30三個基數。如果表中30w條記錄那麼這些列也只會分爲3組,進行位圖查找十分的方便和便捷。位圖索引以一種壓縮數據的格式存放,佔用磁盤空間要比B樹索引小很多。
create bitmap index emp_deptno_index on c##scott.emp(deptno);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章