国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

橫向比較數據庫中不同的索引機制

數據庫
索引是數據庫中非常重要的一個概念,數據庫管理員必須經常與索引打交道。如何更好的理解索引,用好索引,本文能給大家一些啟發。

一、引言

對數據庫索引的關注從未淡出我的們的討論,那么數據庫索引是什么樣的?聚集索引與非聚集索引有什么不同?希望本文對各位同仁有一定的幫助。有不少存疑的地方,誠心希望各位不吝賜教指正,共同進步。

二、B-Tree

我們常見的數據庫系統,其索引使用的數據結構多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。所以在最開始,簡單地介紹一下B-Tree。

B-Tree不同于Binary Tree(二叉樹,最多有兩個子樹),一棵M階的B-Tree滿足以下條件:

1)每個結點至多有M個孩子;

2)除根結點和葉結點外,其它每個結點至少有M/2個孩子;

3)根結點至少有兩個孩子(除非該樹僅包含一個結點);

4)所有葉結點在同一層,葉結點不包含任何關鍵字信息;

5)有K個關鍵字的非葉結點恰好包含K+1個孩子;

另外,對于一個結點,其內部的關鍵字是從小到大排序的。以下是B-Tree(M=4)的樣例:

 

對于每個結點,主要包含一個關鍵字數組Key[],一個指針數組(指向兒子)Son[]。在B-Tree內,查找的流程是:使用順序查找(數組長度較短時)或折半查找方法查找Key[]數組,若找到關鍵字K,則返回該結點的地址及K在Key[]中的位置;否則,可確定K在某個Key[i]和Key[i+1]之間,則從Son[i]所指的子結點繼續查找,直到在某結點中查找成功;或直至找到葉結點且葉結點中的查找仍不成功時,查找過程失敗。

接著,我們使用以下圖片演示如何生成B-Tree(M=4,依次插入1~6):
從圖可見,當我們插入關鍵字4時,由于原結點已經滿了,故進行分裂,基本按一半的原則進行分裂,然后取出中間的關鍵字2,升級(這里是成為根結點)。其它的依類推,就是這樣一個大概的過程。

三、數據庫索引

1.什么是索引

在數據庫中,索引的含義與日常意義上的“索引”一詞并無多大區別(想想小時候查字典),它是用于提高數據庫表數據訪問速度的數據庫對象。

A)索引可以避免全表掃描。多數查詢可以僅掃描少量索引頁及數據頁,而不是遍歷所有數據頁。

B)對于非聚集索引,有些查詢甚至可以不訪問數據頁。

C)聚集索引可以避免數據插入操作集中于表的***一個數據頁。

D)一些情況下,索引還可用于避免排序操作。

當然,眾所周知,雖然索引可以提高查詢速度,但是它們也會導致數據庫系統更新數據的性能下降,因為大部分數據更新需要同時更新索引。

2.索引的存儲

一條索引記錄中包含的基本信息包括:鍵值(即你定義索引時指定的所有字段的值)+邏輯指針(指向數據頁或者另一索引頁)。

 

當你為一張空表創建索引時,數據庫系統將為你分配一個索引頁,該索引頁在你插入數據前一直是空的。此頁此時既是根結點,也是葉結點。每當你往表中插入一行數據,數據庫系統即向此根結點中插入一行索引記錄。當根結點滿時,數據庫系統大抵按以下步驟進行分裂:

A)創建兩個兒子結點

B)將原根結點中的數據近似地拆成兩半,分別寫入新的兩個兒子結點

C)根結點中加上指向兩個兒子結點的指針

通常狀況下,由于索引記錄僅包含索引字段值(以及4-9字節的指針),索引實體比真實的數據行要小許多,索引頁相較數據頁來說要密集許多。一個索引頁可以存儲數量更多的索引記錄,這意味著在索引中查找時在I/O上占很大的優勢,理解這一點有助于從本質上了解使用索引的優勢。

3.索引的類型

A)聚集索引,表數據按照索引的順序來存儲的。對于聚集索引,葉子結點即存儲了真實的數據行,不再有另外單獨的數據頁。

B)非聚集索引,表數據存儲順序與索引順序無關。對于非聚集索引,葉結點包含索引字段值及指向數據頁數據行的邏輯指針,該層緊鄰數據頁,其行數量與數據表行數據量一致。


在一張表上只能創建一個聚集索引,因為真實數據的物理順序只可能是一種。如果一張表沒有聚集索引,那么它被稱為“堆集”(Heap)。這樣的表中的數據行沒有特定的順序,所有的新行將被添加的表的末尾位置。

4.聚集索引

在聚集索引中,葉結點也即數據結點,所有數據行的存儲順序與索引的存儲順序一致。

1)聚集索引與查詢操作

如上圖,我們在名字字段上建立聚集索引,當需要在根據此字段查找特定的記錄時,數據庫系統會根據特定的系統表查找的此索引的根,然后根據指針查找下一個,直到找到。例如我們要查詢“Green”,由于它介于[Bennet,Karsen],據此我們找到了索引頁1007,在該頁中“Green”介于[Greane, Hunter]間,據此我們找到葉結點1133(也即數據結點),并最終在此頁中找以了目標數據行。

此次查詢的IO包括3個索引頁的查詢(其中***一次實際上是在數據頁中查詢)。這里的查找可能是從磁盤讀取(Physical Read)或是從緩存中讀取(Logical Read),如果此表訪問頻率較高,那么索引樹中較高層的索引很可能在緩存中被找到。所以真正的IO可能小于上面的情況。

2)聚集索引與插入操作

最簡單的情況下,插入操作根據索引找到對應的數據頁,然后通過挪動已有的記錄為新數據騰出空間,***插入數據。

如果數據頁已滿,則需要拆分數據頁(頁拆分是一種耗費資源的操作,一般數據庫系統中會有相應的機制要盡量減少頁拆分的次數,通常是通過為每頁預留空間來實現):

A)在該使用的數據段(extent)上分配新的數據頁,如果數據段已滿,則需要分配新段。

B)調整索引指針,這需要將相應的索引頁讀入內存并加鎖。

C)大約有一半的數據行被歸入新的數據頁中。

D)如果表還有非聚集索引,則需要更新這些索引指向新的數據頁。

特殊情況

A)如果新插入的一條記錄包含很大的數據,可能會分配兩個新數據頁,其中之一用來存儲新記錄,另一存儲從原頁中拆分出來的數據。

B)通常數據庫系統中會將重復的數據記錄存儲于相同的頁中。

C)類似于自增列為聚集索引的,數據庫系統可能并不拆分數據頁,頁只是簡單的新添數據頁。

3)聚集索引與刪除操作

刪除行將導致其下方的數據行向上移動以填充刪除記錄造成的空白。

如果刪除的行是該數據頁中的***一行,那么該數據頁將被回收,相應的索引頁中的記錄將被刪除。如果回收的數據頁位于跟該表的其它數據頁相同的段上,那么它可能在隨后的時間內被利用。如果該數據頁是該段的唯一一個數據頁,則該段也被回收。

對于數據的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的“索引合并”。

5.非聚集索引

非聚集索引與聚集索引相比:

A)葉子結點并非數據結點

B)葉子結點為每一真正的數據行存儲一個“鍵-指針”對

C)葉子結點中還存儲了一個指針偏移量,根據頁指針及指針偏移量可以定位到具體的數據行。

D)類似的,在除葉結點外的其它索引結點,存儲的也是類似的內容,只不過它是指向下一級的索引頁的。

聚集索引是一種稀疏索引,數據頁上一級的索引頁存儲的是頁指針,而不是行指針。而對于非聚集索引,則是密集索引,在數據頁的上一級索引頁它為每一個數據行存儲一條索引記錄。

#p#

對于根與中間級的索引記錄,它的結構包括:

A)索引字段值

B)RowId(即對應數據頁的頁指針+指針偏移量)。在高層的索引頁中包含RowId是為了當索引允許重復值時,當更改數據時精確定位數據行。

C)下一級索引頁的指針

對于葉子層的索引對象,它的結構包括:

A)索引字段值

B)RowId

 

1)非聚集索引與查詢操作

針對上圖,如果我們同樣查找“Green”,那么一次查詢操作將包含以下IO:3個索引頁的讀取+1個數據頁的讀取。同樣,由于緩存的關系,真實的IO實際可能要小于上面列出的。

2)非聚集索引與插入操作

如果一張表包含一個非聚集索引但沒有聚集索引,則新的數據將被插入到最末一個數據頁中,然后非聚集索引將被更新。如果也包含聚集索引,該聚集索引將被用于查找新行將要處于什么位置,隨后,聚集索引、以及非聚集索引將被更新。

3)非聚集索引與刪除操作

如果在刪除命令的Where子句中包含的列上,建有非聚集索引,那么該非聚集索引將被用于查找數據行的位置,數據刪除之后,位于索引葉子上的對應記錄也將被刪除。如果該表上有其它非聚集索引,則它們葉子結點上的相應數據也要刪除。

如果刪除的數據是該數所頁中的唯一一條,則該頁也被回收,同時需要更新各個索引樹上的指針。

由于沒有自動的合并功能,如果應用程序中有頻繁的隨機刪除操作,***可能導致表包含多個數據頁,但每個頁中只有少量數據。

6.索引覆蓋

索引覆蓋是這樣一種索引策略:當某一查詢中包含的所需字段皆包含于一個索引中,此時索引將大大提高查詢性能。

包含多個字段的索引,稱為復合索引。索引最多可以包含31個字段,索引記錄***長度為600B。如果你在若干個字段上創建了一個復合的非聚集索引,且你的查詢中所需Select字段及Where,Order By,Group By,Having子句中所涉及的字段都包含在索引中,則只搜索索引頁即可滿足查詢,而不需要訪問數據頁。由于非聚集索引的葉結點包含所有數據行中的索引列值,使用這些結點即可返回真正的數據,這種情況稱之為“索引覆蓋”。

在索引覆蓋的情況下,包含兩種索引掃描:

A)匹配索引掃描

B)非匹配索引掃描

1)匹配索引掃描

此類索引掃描可以讓我們省去訪問數據頁的步驟,當查詢僅返回一行數據時,性能提高是有限的,但在范圍查詢的情況下,性能提高將隨結果集數量的增長而增長。

針對此類掃描,索引必須包含查詢中涉及的的所有字段,另外,還需要滿足:Where子句中包含索引中的“引導列”(Leading Column),例如一個復合索引包含A,B,C,D四列,則A為“引導列”。如果Where子句中所包含列是BCD或者BD等情況,則只能使用非匹配索引掃描。

2)非配置索引掃描

正如上述,如果Where子句中不包含索引的導引列,那么將使用非配置索引掃描。這最終導致掃描索引樹上的所有葉子結點,當然,它的性能通常仍強于掃描所有的數據頁。

【編輯推薦】

  1. SQL Server索引管理之六大鐵律
  2. MySQL優化之索引的使用
  3. 深入MySQL數據庫的索引
責任編輯:彭凡 來源: 51CTO博客
相關推薦

2011-08-04 15:55:25

SQL Server數

2010-05-26 13:42:08

MySQL數據庫索引

2010-07-01 14:18:09

SQL Server數

2010-07-09 11:28:12

SQL Server數

2010-05-21 10:01:11

MySQL數據庫

2011-03-18 11:24:07

Oracle 數據庫時間問題

2011-08-04 13:07:59

數據庫查詢TOP子句

2011-03-16 08:54:45

Oracle數據庫索引

2017-05-25 10:23:13

數據a表b表

2011-10-11 17:07:12

數據庫Internet文件數據庫

2009-02-04 17:36:11

ibmdwXML

2017-02-08 11:00:50

數據庫索引類型

2017-05-19 13:42:51

JavaSpring框架數據庫

2011-08-10 11:07:34

MySQL查詢緩沖

2011-07-14 09:48:13

Oracle數據庫

2010-04-21 14:11:56

Oracle數據庫

2021-10-26 08:00:00

數據庫架構技術

2021-11-01 23:57:03

數據庫哈希索引

2010-04-21 14:45:39

Oracle數據庫

2011-07-11 10:42:23

SQL數據庫橫向數據縱向字段
點贊
收藏

51CTO技術棧公眾號

欧美三区美女| 国产欧美日韩| 亚洲国产乱码最新视频| 日韩精品在线中文字幕| 一区二区在线| 欧美与黑人午夜性猛交久久久| 欧美aaa视频| 欧美一区二区三区免费观看视频| 青青草免费在线视频| 一区二区三区在线高清| 亚洲成人av免费看| 久久毛片高清国产| av动漫在线免费观看| 免费成人av在线| 欧美重口乱码一区二区| 在线播放日韩| 久久99九九| 亚洲一区国产| 日本午夜精品一区二区三区| 日韩中文字幕亚洲一区二区va在线 | 成人高清免费在线| 欧美日韩中文另类| 国产高清av在线| 欧洲色大大久久| www.av在线| 日韩午夜小视频| 中文在线免费视频| 日韩中文理论片| 日韩三级不卡| 欧美中文字幕视频在线观看| 欧美丝袜一区| 91av免费看| 久久精品盗摄| 日本天堂免费a| 国产视频不卡一区| 日本调教视频在线观看| 五月开心婷婷久久| 成人黄色在线电影| 中文字幕久久亚洲| 久久综合社区| 5g影院天天爽成人免费下载| 久久综合激情| 日韩欧美一区二| 亚洲一区二区美女| √天堂8在线网| 丝袜情趣国产精品| 欧美男男freegayvideosroom| 成人网中文字幕| 天堂一区二区在线| 久久国产乱子伦免费精品| 亚洲永久免费av| 性欧美猛交videos| 欧美精品一区三区| 欧美福利影院| 精品成在人线av无码免费看| 尤物视频一区二区| 激情网站在线| 91国产美女在线观看| 亚洲天堂激情| 国产免费黄视频| 欧美婷婷六月丁香综合色| 成人在线黄色| 成人精品一区二区三区电影免费| 日韩成人一区二区| 琪琪五月天综合婷婷| 日韩欧美在线综合网| 加勒比视频一区| 日本一区二区三不卡| 国产精品欧美极品| 26uuu亚洲电影在线观看| 欧美日韩国产第一页| 国内精品美女在线观看| 岛国大片在线播放| 91久久国产综合久久| 久久久国产精品入口麻豆| 国产精品一区二区欧美| 国产婷婷色一区二区三区在线| 777电影在线观看| 欧美精品久久久久久久久| 亚洲欧美日本日韩| 99热在线免费播放| 国产丝袜高跟一区| 欧美激情亚洲| 四虎最新地址发布| 精品无人国产偷自产在线| 91九色精品| 欧在线一二三四区| 欧美挠脚心视频网站| 精品自拍偷拍| 免费看日本黄色| 在线播放日韩导航| 精品国产乱码| 成人免费无码av| 亚洲精品理论电影| 国产精品麻豆久久| 久草在线国产| 日韩小视频网址| 麻豆精品在线看| 成人性爱视频在线观看| 日本久久亚洲电影| 久久久久国产一区二区三区四区| 欧美午夜大胆人体| 亚洲一区二区三区sesese| 中文字幕亚洲一区二区av在线| 天天综合网站| 色爱区成人综合网| 欧美午夜在线观看| 国产精品久久久久久久免费观看| 四虎黄色影院| 久久综合久久八八| 精品中文字幕一区二区小辣椒 | 免费成人在线电影| caoporen国产精品| 亚洲永久精品大片| 欧美人妖视频| 国产二区视频在线播放| 亚洲美女av黄| 久草这里只有精品视频| 青春草视频在线| 你懂的视频在线一区二区| 欧美午夜精品一区二区蜜桃 | 51午夜精品视频| 久久综合一区二区| a屁视频一区二区三区四区| 在线观看亚洲视频啊啊啊啊| 欧美一区二区精品在线| 国产欧美一区二区三区国产幕精品| 你懂的视频在线播放| 成人午夜在线观看| 欧美性猛交xxxx黑人猛交| 久久久久久美女精品| 久久综合九色综合久| 国产精品福利视频| 6080亚洲精品一区二区| 天堂久久久久va久久久久| 日本动漫同人动漫在线观看| 日韩中文一区二区三区| 亚洲国产小视频在线观看| 黄一区二区三区| 亚洲电影有码| 亚洲性生活网站| 国产99久久久欧美黑人| 亚洲成a人v欧美综合天堂| 欧美激情亚洲| 岛国成人毛片| 国产精品12p| 久久不射电影网| 亚洲少妇屁股交4| 国产精品传媒精东影业在线| 黄色大片在线看| 日本一区二区三区精品视频| 国产午夜精品麻豆| 久久久国际精品| 美女毛片一区二区三区四区最新中文字幕亚洲 | 精品国产一区二区三区久久久蜜臀 | v888av成人| 国产成人精品久久久| 午夜精品福利久久久| 亚洲国产高清视频| 毛片在线网址| 欧美大片在线播放| 日韩美女写真福利在线观看| 色8久久人人97超碰香蕉987| 日韩精品乱码av一区二区| a成人v在线| 久久国产情侣| 精品国产一区二区三| 亚洲精品资源在线| 欧美极品美女视频| 亚洲欧美色图| 97人澡人人添人人爽欧美| 国产成人精品无码播放| 成人亲热视频网站| 亚洲欧洲日韩国产| 亚洲精品va在线观看| 免费看亚洲片| 高清日韩中文字幕| 免费**毛片在线| 久久精品网站视频| 成人免费观看网站| 亚洲人成网站免费播放| 亚洲素人一区二区| 日韩av在线发布| 欧美一性一交| 欧洲精品二区| 成年人在线免费观看视频网站| 精品一区久久| 欧美国产日本在线| 欧美日本一区二区| 国产精品嫩草99a| 老司机精品视频网站| 国产丝袜一区| 国模私拍一区二区国模曼安| av在线不卡播放| 日本熟妇人妻xxxx| 国产欧美日韩伦理| 久久久女人电视剧免费播放下载 | 国产一区二区三区不卡在线观看| 精品99在线| 国产精品99|