免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Java面試之數(shù)據(jù)庫——數(shù)據(jù)庫索引

原文:https://blog.csdn.net/sundacheng1989/article/details/53117172

https://www.cnblogs.com/gavinsp/p/5513536.html

https://www.cnblogs.com/lpshou/p/3364282.html

最近使用到Oracle數(shù)據(jù)庫的索引比較多,所以就想好好研究一下索引到底是什么。畢竟作為一個Application Developer,而不是DBA,所以這篇文字也是很通俗,特別淺顯的描述了一下索引相關(guān)的概念。

 

為什么需要索引?數(shù)據(jù)在磁盤上是以塊的形式存儲的。為確保對磁盤操作的原子性,訪問數(shù)據(jù)的時候會一并訪問所有數(shù)據(jù)塊。磁盤上的這些數(shù)據(jù)塊與鏈表類似,即它們都包含一個數(shù)據(jù)段和一個指針,指針指向下一個節(jié)點(數(shù)據(jù)塊)的內(nèi)存地址,而且它們都不需要連續(xù)存儲(即邏輯上相鄰的數(shù)據(jù)塊在物理上可以相隔很遠)。

 

舉個例子來講,我們有一個數(shù)據(jù)表User.為了簡便,這個表沒有主鍵。

 

Identity

Name

Age

Grade

1

Robin

28

90

5

Lilei

26

60

3

Hanmei

25

50

4

Lucy

27

66

2

Lily

29

80

 

雖然這些數(shù)據(jù)都存在于一個User表中,但是物理上,這些數(shù)據(jù)可能存儲在分散的數(shù)據(jù)塊中。

 

查找Lily這個人的信息已知LilyIdentity2, select * fromUser where Identity= 2.

 

在查找的時候,首先找到這個表的第一條記錄所在的數(shù)據(jù)庫地址,然后發(fā)現(xiàn)Identity1,并不是所需要的值,然后在這個數(shù)據(jù)庫的底端,找到了下一個數(shù)據(jù)塊的地址。(這個類似于鏈表),如此一來,查詢了5次才找到了所需要的值。(為了簡單起見,我們考慮Identity不能有重復(fù)值)

 

為了加快搜索速度,這里就出現(xiàn)了索引。索引是對某個字段進行排序的一種方式。對表中的某個字段建立索引會創(chuàng)建另一種數(shù)據(jù)結(jié)構(gòu),其中保存著字段的值,每個值又指向與它相關(guān)的記錄。這種索引的數(shù)據(jù)結(jié)構(gòu)是經(jīng)過排序的,因而可以對其執(zhí)行二分查找。

 

對上個表的Identity字段進行索引,就是在數(shù)據(jù)庫存儲空間上創(chuàng)建一塊專用的控件,把User表的所有的Identity字段的值拿出來放到這里,并且對這些值進行排序,并且每個值都攜帶著這個Identity對應(yīng)的行所在數(shù)據(jù)塊的地址。因為Identity是進過排序的,按照一定的數(shù)據(jù)結(jié)構(gòu)存儲的,所以數(shù)據(jù)庫引擎在查找的時候,比如說查找identity5,引擎就會計算,5大概在整個排序結(jié)構(gòu)的大致地方,然后到那里去拿出這個值看看是不是,不是的話就再次相應(yīng)的向左或者向右移動去尋找。(這里用到的知識都是大學(xué)時候的數(shù)據(jù)結(jié)構(gòu)的知識,二分法查找,相對于毫無頭緒的一個一個的查找,二分法的查找速度明顯的提高,達到了log2 N,其實這有多快我也不明白,反正就記得當時學(xué)的時候,確實是比一般查找快多了。)

 

通俗的來講,就是根據(jù)你指定的列,建立一個遵循一定數(shù)據(jù)結(jié)構(gòu)的區(qū)域,這些區(qū)域可以快速定位到相應(yīng)數(shù)據(jù)庫字段所在的磁盤地址。

 

 

索引的好處是特別明顯的,那就是大大的提高了查詢的速度。但是相對應(yīng)的也帶來了一些不好的地方。


第一,創(chuàng)建索引和維護索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。

第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。

第三,當對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,這樣就降低了數(shù)據(jù)的維護速度。

 

 

最后還有一點需要注意的是,我們在數(shù)據(jù)庫上對于某個字段建立了索引,那么什么情況下才走索引呢?

 

比如 select * from User where Identity= 2 這條語句,是走索引查詢的。因為是否走索引取決于這條查詢語句的where子句。數(shù)據(jù)庫引擎發(fā)現(xiàn)你的where語句中有identity,那么就會從identity的索引數(shù)據(jù)結(jié)構(gòu)中進行檢索。曾經(jīng)看到有人說select *會降低檢索速度,這個跟索引沒關(guān)系,select * 降低檢索速度,是因為從數(shù)據(jù)庫服務(wù)器端到客戶端的網(wǎng)絡(luò)傳輸是有時間的,select * 中難免包含著不必要的字段,所以傳輸起來會比較慢。

 

接下來單純的比較一下select * select 單個字段在速度上的區(qū)別。如果數(shù)據(jù)量非常非常大的話,這種速度上的差別是非常明顯的。下邊這個例子,是從相同的數(shù)據(jù)庫表中去拿數(shù)據(jù)。

 

當只是返回一個OUT_ID字段的時候,你可以看到49秒鐘的時候就處理了30萬條數(shù)據(jù)。





這時候我們使用select * 這種方式,我們發(fā)現(xiàn),在用事一分鐘的時候,才處理了3萬條數(shù)據(jù)。




從上邊的對比中我們可以看出,在數(shù)據(jù)量非常大而且數(shù)據(jù)表字段非常多的時候,這兩種方式在檢索時間上的差別還是非常大的。


---------------------------------------------------------------------------------------------------------------------------------------

1、索引定義
  數(shù)據(jù)庫索引好比是一本書前面的目錄,能加快數(shù)據(jù)庫的查詢速度。索引是對數(shù)據(jù)庫表中一個或多個列(例如,employee 表的姓氏 (lname) 列)的值進行排序的結(jié)構(gòu)。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。

2、建立索引的優(yōu)缺點:
優(yōu)點:
1.大大加快數(shù)據(jù)的檢索速度;
2.創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性;
3.加速表和表之間的連接;
4.在使用分組和排序子句進行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間。
缺點:

  1.索引需要占用數(shù)據(jù)表以外的物理存儲空間

  2.創(chuàng)建索引和維護索引要花費一定的時間

  3.當對表進行更新操作時,索引需要被重建,這樣降低了數(shù)據(jù)的維護速度。
3、索引類型:
根據(jù)數(shù)據(jù)庫的功能,可以在數(shù)據(jù)庫設(shè)計器中創(chuàng)建索引:唯一索引、主鍵索引和聚集索引。 盡管唯一索引有助于定位信息,但為獲得最佳性能結(jié)果,建議改用主鍵或唯一約束。

唯一索引: UNIQUE 例如:create unique index stusno on student(sno);
表明此索引的每一個索引值只對應(yīng)唯一的數(shù)據(jù)記錄,
對于單列惟一性索引,這保證單列不包含重復(fù)的值。對于多列惟一性索引,保證多個值的組合不重復(fù)。
主鍵索引: primary key
數(shù)據(jù)庫表經(jīng)常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。 在數(shù)據(jù)庫關(guān)系圖中為表定義
主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數(shù)據(jù)的快速訪問。

聚集索引(也叫聚簇索引):cluster
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。 如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度。
 
4、索引的實現(xiàn)方式
1 B 樹 我們經(jīng)常聽到B 樹就是這個概念,用這個樹的目的和紅黑樹差不多,也是為了盡量保持樹的平衡,當然紅黑樹是二叉樹,但B 樹就不是二叉樹了,節(jié)點下面可以有多個子節(jié)點,數(shù)據(jù)庫開發(fā)商會設(shè)置子節(jié)點數(shù)的一個最大值,這個值不會太小,所以B 樹一般來說比較矮胖,而紅黑樹就比較瘦高了。
關(guān)于B 樹的插入,刪除,會涉及到一些算法以保持樹的平衡,這里就不詳述了。ORACLE的默認索引就是這種結(jié)構(gòu)的。
如果經(jīng)常需要同時對兩個字段進行AND查詢,那么使用兩個單獨索引不如建立一個復(fù)合索引,因為兩個單獨索引通常數(shù)據(jù)庫只能使用其中一個,而使用復(fù)合索引因為索引本身就對應(yīng)到兩個字段上的,效率會有很大提高。

2 散列索引

第二種索引叫做散列索引,就是通過散列函數(shù)來定位的一種索引,不過很少有單獨使用散列索引的,反而是散列文件組織用的比較多。
散列文件組織就是根據(jù)一個鍵通過散列計算把對應(yīng)的記錄都放到同一個槽中,這樣的話相同的鍵值對應(yīng)的記錄就一定是放在同一個文件里了,也就減少了文件讀取的次數(shù),提高了效率。
散列索引呢就是根據(jù)對應(yīng)鍵的散列碼來找到最終的索引項的技術(shù),其實和B樹就差不多了,也就是一種索引之上的二級輔助索引,我理解散列索引都是二級或更高級的稀疏索引,否則桶就太多了,效率也不會很高。

3 位圖索引

位圖索引是一種針對多個字段的簡單查詢設(shè)計一種特殊的索引,適用范圍比較小,只適用于字段值固定并且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態(tài)等等,并且只有在同時對多個這樣的字段查詢時才能體現(xiàn)出位圖的優(yōu)勢。
位圖的基本思想就是對每一個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那么如果使用位圖索引就會建立兩個位圖,對應(yīng)男的10110和對應(yīng)女的01001,這樣做有什么好處呢,就是如果同時對多個這種類型的字段進行and或or查詢時,可以使用按位與和按位或來直接得到結(jié)果了。

B 樹最常用,性能也不差,用于范圍查詢和單值查詢都可以。特別是范圍查詢,非得用B 樹這種順序的才可以了。
HASH的如果只是對單值查詢的話速度會比B 樹快一點,但是ORACLE好像不支持HASH索引,只支持HASH表空間。
位圖的使用情況很局限,只有很少的情況才能用,一定要確定真正適合使用這種索引才用(值的類型很少并且需要復(fù)合查詢),否則建立一大堆位圖就一點意義都沒有了。

5 Hash索引缺點

 MySQL的B-Tree索引和Hash索引的區(qū)別



本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
數(shù)據(jù)庫引擎 MyIASM /InnoDB
史上最全的技術(shù)崗面試筆記——數(shù)據(jù)庫篇(上)
04.深入淺出索引(上)undefined
干貨收藏!100道MySQL數(shù)據(jù)庫經(jīng)典面試題解析
MYSQL數(shù)據(jù)庫優(yōu)化(一)
深入淺出數(shù)據(jù)庫索引原理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服