溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

索引與數(shù)據(jù)完整性的故事

發(fā)布時間:2020-07-20 15:54:21 來源:網(wǎng)絡(luò) 閱讀:953 作者:長路慢 欄目:關(guān)系型數(shù)據(jù)庫

    話說數(shù)據(jù)庫也有著重要的衡量指標,那么性能和安全絕對是重要的兩大板塊,在這里性能指的是處理與響應(yīng)戶端服務(wù)的速度,而安全則是數(shù)據(jù)完整性規(guī)則。

    為啥要用索引?

        我們知道,當我們用select去查詢一個表內(nèi)容,或者用where指定一些關(guān)鍵字,Oracle會遍歷整個表去尋找我們的數(shù)據(jù),不會因為where找到了數(shù)據(jù)而不繼續(xù)遍歷,因為Oracle不知道是否數(shù)據(jù)表后面的字段有沒有我們要的數(shù)據(jù),所以還會遍歷整個表數(shù)據(jù),那么當一個大數(shù)據(jù)文件,是非常耗時的操作,為了提高我們的檢索效率,更快速更高效的去找到我們想要的數(shù)據(jù),也算是索引設(shè)計的初衷之一。

    索引怎樣高效?

      為什么用力了索引就會高效,那么我們一起來了解一下索引的原理把,關(guān)系型數(shù)據(jù)庫每一行都會有ROWID的,那么ROWID包括該行的條件、文件中的BOLACKS等,那么說到這里大概就知道!索引建立依靠ROWID來進行的,按照索引的村存儲方法有B樹的,還有位圖索引。個人組織語言講解這兩種類型怕誤人子弟引用百度知識!

    (1)B*樹索引的存儲結(jié)構(gòu)類似書的索引結(jié)構(gòu),有分支和葉兩種類型的存儲數(shù)據(jù)塊,分支塊相當于書的大目錄,葉塊相當于索引到的具體的書頁。Oracle用B*樹機制存儲索引條目,以保證用最短路徑訪問鍵值。默認情況下大多使用B*樹索引,該索引就是通常所見的唯一索引、逆序索引。

    (2)位圖索引存儲主要用于節(jié)省空間,減少oracle對數(shù)據(jù)塊的訪問。它采用位圖偏移方式來與表的行ID號對應(yīng),采用位圖索引一般是重復值太多的表字段。位圖索引之所以在實際密集型OLTP(聯(lián)機事物處理)中用的比較少,是因為OLTP會對表進行大量的刪除、修改、新建操作。Oracle每次進行操作都會對要操作的數(shù)據(jù)塊加鎖。以防止多人操作容易產(chǎn)生的數(shù)據(jù)庫鎖等待甚至死鎖現(xiàn)象。在OLAP(聯(lián)機分析處理)中應(yīng)用位圖有優(yōu)勢,因為OLAP中大部分是對數(shù)據(jù)庫的查詢操作,而且一般采用數(shù)據(jù)倉庫技術(shù),所以大量數(shù)據(jù)采用位圖索引節(jié)省空間比較明顯。當創(chuàng)建表的命令中包含有唯一性關(guān)鍵字時,不能創(chuàng)建位圖索引,創(chuàng)建全局分區(qū)索引時也不能用位圖索引。

    以上就是百度百科對兩種結(jié)構(gòu)的介紹

    格式:

        create index index_name on people(name)

    解釋:

        那么index就是創(chuàng)建索引的關(guān)鍵字,這時候索引就會在表people列name上建立,會根據(jù)ROWID等信息把名字信息分塊處理。

    通過本人測試不貼圖了,對10W條數(shù)據(jù)進行測試,普通查找的COST的為400左右,當為某一列建立索引之后,4左右,效率100倍!

    DML的影響

     確實在檢索方面很快,但是缺點無疑暴露,不適合頻繁插入,更改刪除等操作,為啥?。恳驗楫斘覀儾迦胍矔λ饕M行修改,那么索引中不會把你修改刪除的數(shù)據(jù)從塊中清理釋放內(nèi)存,只是打上標記,而且有時候可能會改變“顛覆”原結(jié)構(gòu),重要的是不釋放空間資源,所以我們在頻繁插入修改刪除的表中盡量避免索引這種機制,其次在數(shù)據(jù)量少的情況下也要去避免這種機制,因為小數(shù)據(jù)還要為索引建立格外開銷,本身不具備什么優(yōu)勢。

    數(shù)據(jù)完整性(Data integrity)

     索引他就簡單的說完了,談?wù)剶?shù)據(jù)的完整性,在前面很多章節(jié)都提到過數(shù)據(jù)的完整性,我們大多數(shù)認為就是數(shù)據(jù)比較完善就是數(shù)據(jù)的完整性,其實分的很精細,數(shù)據(jù)的完整性是指數(shù)據(jù)的可靠性和精確性.

     進一步的說,數(shù)據(jù)的完整性又分為實體完整性,參照完整,域完整性,用戶自定義完整性四大類。

    實體完整性(Entity)

        簡單來說,就是行的完整性,不能為空值,保證唯一性約束。那么通常用主鍵來保證實體的完整性,當主鍵有多列還會聲明唯一性約束UNIQE來保證唯一標識。

    參照完整性 (Domain integrity)

                表與表之間的關(guān)系,對于父子表如果進行插入更新刪除操作,只完成其中一個表就會破壞參照的完整性,字表為隨著父表二變化,外鍵一般用來保證參照完整性的約束。

    域完整(Referential Integrity)

                域完整是指滿嘴特殊的數(shù)據(jù)類型或者約束的列,比如check,not null,default等都在域完整的范圍內(nèi)。

    用戶自定義完整(User-defined Integrity

                用戶自定義完整多數(shù)在用戶對列中數(shù)據(jù)類型,字段的約束,比如我只想某一個字段插入什么樣的內(nèi)容,或者只允許插入1500元以下工資等等,根據(jù)我們的需求通過SQL語句動作得到預期的結(jié)果這個過程保證了我們自定義的完整,如CHECK檢車約束的使用。

        更深入的知識這里不多做分享,怕誤人子弟,以上是個人參照書籍資料加上自己的理解分享給大家的知識,不足之處希望指點出一定改進!



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI