索引與數據完整性的故事
為啥要用索引?
我們知道,當我們用select去查詢一個表內容,或者用where指定一些關鍵字,Oracle會遍歷整個表去尋找我們的數據,不會因為where找到了數據而不繼續遍歷,因為Oracle不知道是否數據表後面的字段有沒有我們要的數據,所以還會遍歷整個表數據,那麽當一個大數據文件,是非常耗時的操作,為了提高我們的檢索效率,更快速更高效的去找到我們想要的數據,也算是索引設計的初衷之一。
索引怎樣高效?
為什麽用力了索引就會高效,那麽我們一起來了解一下索引的原理把,關系型數據庫每一行都會有ROWID的,那麽ROWID包括該行的條件、文件中的BOLACKS等,那麽說到這裏大概就知道!索引建立依靠ROWID來進行的,按照索引的村存儲方法有B樹的,還有位圖索引。個人組織語言講解這兩種類型怕誤人子弟引用百度知識!
(1)B*樹索引的存儲結構類似書的索引結構,有分支和葉兩種類型的存儲數據塊,分支塊相當於書的大目錄,葉塊相當於索引到的具體的書頁。Oracle用B*樹機制存儲索引條目,以保證用最短路徑訪問鍵值。默認情況下大多使用B*樹索引,該索引就是通常所見的唯一索引、逆序索引。
(2)位圖索引存儲主要用於節省空間,減少oracle對數據塊的訪問。它采用位圖偏移方式來與表的行ID號對應,采用位圖索引一般是重復值太多的表字段。位圖索引之所以在實際密集型OLTP(聯機事物處理)中用的比較少,是因為OLTP會對表進行大量的刪除、修改、新建操作。Oracle每次進行操作都會對要操作的數據塊加鎖。以防止多人操作容易產生的數據庫鎖等待甚至死鎖現象。在OLAP(聯機分析處理)中應用位圖有優勢,因為OLAP中大部分是對數據庫的查詢操作,而且一般采用數據倉庫技術,所以大量數據采用位圖索引節省空間比較明顯。當創建表的命令中包含有唯一性關鍵字時,不能創建位圖索引,創建全局分區索引時也不能用位圖索引。
以上就是百度百科對兩種結構的介紹
格式:
create index index_name on people(name)
解釋:
那麽index就是創建索引的關鍵字,這時候索引就會在表people列name上建立,會根據ROWID等信息把名字信息分塊處理。
通過本人測試不貼圖了,對10W條數據進行測試,普通查找的COST的為400左右,當為某一列建立索引之後,4左右,效率100倍!
DML的影響
確實在檢索方面很快,但是缺點無疑暴露,不適合頻繁插入,更改刪除等操作,為啥啊?因為當我們插入也會對索引進行修改,那麽索引中不會把你修改刪除的數據從塊中清理釋放內存,只是打上標記,而且有時候可能會改變“顛覆”原結構,重要的是不釋放空間資源,所以我們在頻繁插入修改刪除的表中盡量避免索引這種機制,其次在數據量少的情況下也要去避免這種機制,因為小數據還要為索引建立格外開銷,本身不具備什麽優勢。
數據完整性(Data integrity)
索引他就簡單的說完了,談談數據的完整性,在前面很多章節都提到過數據的完整性,我們大多數認為就是數據比較完善就是數據的完整性,其實分的很精細,數據的完整性是指數據的可靠性和精確性.
進一步的說,數據的完整性又分為實體完整性,參照完整,域完整性,用戶自定義完整性四大類。
實體完整性(Entity)
簡單來說,就是行的完整性,不能為空值,保證唯一性約束。那麽通常用主鍵來保證實體的完整性,當主鍵有多列還會聲明唯一性約束UNIQE來保證唯一標識。
參照完整性 (Domain integrity)
表與表之間的關系,對於父子表如果進行插入更新刪除操作,只完成其中一個表就會破壞參照的完整性,字表為隨著父表二變化,外鍵一般用來保證參照完整性的約束。
域完整(Referential Integrity)
域完整是指滿嘴特殊的數據類型或者約束的列,比如check,not null,default等都在域完整的範圍內。
用戶自定義完整(User-defined Integrity)
用戶自定義完整多數在用戶對列中數據類型,字段的約束,比如我只想某一個字段插入什麽樣的內容,或者只允許插入1500元以下工資等等,根據我們的需求通過SQL語句動作得到預期的結果這個過程保證了我們自定義的完整,如CHECK檢車約束的使用。
更深入的知識這裏不多做分享,怕誤人子弟,以上是個人參照書籍資料加上自己的理解分享給大家的知識,不足之處希望指點出一定改進!
索引與數據完整性的故事