當前位置:首頁 » 存儲配置 » 索引存儲塊

索引存儲塊

發布時間: 2022-09-02 04:16:17

⑴ 數據結構的存儲方式有哪幾種

數據結構的存儲方式有順序存儲方法、鏈接存儲方法、索引存儲方法和散列存儲方法這四種。

1、順序存儲方式:順序存儲方式就是在一塊連續的存儲區域一個接著一個的存放數據,把邏輯上相連的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接掛安息來體現。順序存儲方式也稱為順序存儲結構,一般採用數組或者結構數組來描述。

2、鏈接存儲方法:它比較靈活,其不要求邏輯上相鄰的結點在物理位置上相鄰,結點間的邏輯關系由附加的引用欄位表示。一個結點的引用欄位往往指導下一個結點的存放位置。鏈接存儲方式也稱為鏈接式存儲結構,一般在原數據項中增加應用類型來表示結點之間的位置關系。

3、索引存儲方法:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址。它細分為兩類:稠密索引:每個結點在索引表中都有一個索引項,索引項的地址指示結點所在的的存儲位置;稀疏索引:一組結點在索引表中只對應一個索引項,索引項的地址指示一組結點的起始存儲位置。

4、散列存儲方法:就是根據結點的關鍵字直接計算出該結點的存儲地址。

(1)索引存儲塊擴展閱讀

順序存儲和鏈接存儲的基本原理

在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。

在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,還含有元素之間邏輯關系的信息。數據的鏈式存儲結構可用鏈接表來表示。其中data表示值域,用來存儲節點的數值部分。Pl,p2,…,Pill(1n≥1)均為指針域,每個指針域為其對應的後繼元素或前驅元素所在結點的存儲位置。

在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同;而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。

⑵ mysql innodb 索引到底是b+樹還是b樹

先從數據結構的角度來答。
題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放數據,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。
這就決定了B+樹更適合用來存儲外部數據,也就是所謂的磁碟數據。
從Mysql(Inoodb)的角度來看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關系性資料庫這種數據量大的索引能達到億級別,所以為了減少內存的佔用,索引也會被存儲在磁碟上。
那麼Mysql如何衡量查詢效率呢?磁碟IO次數,B-樹(B類樹)的特定就是每層節點數目非常多,層數很少,目的就是為了就少磁碟IO次數,當查詢數據的時候,最好的情況就是很快找到目標索引,然後讀取數據,使用B+樹就能很好的完成這個目的,但是B-樹的每個節點都有data域(指針),這無疑增大了節點大小,說白了增加了磁碟IO次數(磁碟IO一次讀出的數據量大小是固定的,單個數據變大,每次讀出的就少,IO次數增多,一次IO多耗時啊!),而B+樹除了葉子節點其它節點並不存儲數據,節點小,磁碟IO次數就少。這是優點之一。
另一個優點是什麼,B+樹所有的Data域在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指針串起來。這樣遍歷葉子節點就能獲得全部數據,這樣就能進行區間訪問啦。

至於MongoDB為什麼使用B-樹而不是B+樹,可以從它的設計角度來考慮,它並不是傳統的關系性資料庫,而是以Json格式作為存儲的nosql,目的就是高性能,高可用,易擴展。首先它擺脫了關系模型,上面所述的優點2需求就沒那麼強烈了,其次Mysql由於使用B+樹,數據都在葉節點上,每次查詢都需要訪問到葉節點,而MongoDB使用B-樹,所有節點都有Data域,只要找到指定索引就可以進行訪問,無疑單次查詢平均快於Mysql(但側面來看Mysql至少平均查詢耗時差不多)。

總體來說,Mysql選用B+樹和MongoDB選用B-樹還是以自己的需求來選擇的。

⑶ 重建索引一定能提高索引存儲空間利用率和效率嗎

在日常交流中經常聽到一個錯誤的觀點,資料庫索引需要重建,理由是重建索引至少能有以下好處:

1、索引的重建,即使不能提高性能,也可以壓縮索引的存儲空間,使得單位索
引數據塊所包含的索引更多,效率更高;

2、節省資料庫的存儲空間

但實際上,我們不要盲目的重建索引,有可能重建索引造成索引的存儲空間佔用更大,效率更低。所以重建以前,最好對索引進行分析,查看索引的當前情況,以確定是否要重建。

⑷ 如何檢測Oracle中的空間索引的存儲大小

這些屬性包括段存儲在哪個表空間中,使用了多少位元組來存儲,使用了多少個塊和區已經初始化區大小已經後續分配的區大小等等。
可以根據以下的步驟來確定針對某一個st_geometry表和索引存儲的表所在表空間以及使用多少個位元組和塊存儲。
1. 通過查詢sde.st_geometry_columns表查找表的唯一標示符。
SQL> SELECT geom_id
FROM sde.st_geometry_columns
WHERE owner = USER
AND table_name = 'TAXLOTS';GEOM_ID----------32 2. 使用第一步得到的GEOM_ID的值傳給第二個查詢使用。

⑸ 常用的存儲表示方法有哪幾種

摘要 數據結構的存儲方式有順序存儲方法、鏈接存儲方法、索引存儲方法和散列存儲方法這四種。

⑹ 操作系統,關於文件的問題如題: 已知塊大小為4K,塊號佔4B,問採用幾級索引方式存儲

首先我認為題目條件有問題,沒有告知文件大小就問索引數量。如果直接做的話,通常我們用一個盤塊來作為一個索引塊的大小,看一個索引塊中能放幾個盤塊號,所以第一步得出有1K個盤塊,每個盤塊大小為4K,所以如果每個盤塊號對應一個盤塊,一共能存儲4M的文件,如果文件超出4M,就採用2級索引,既可存儲的盤塊數量變成1K*1K,所以可允許的最大長度就是4G,不知道說清楚了沒有。

⑺ mysql索引使用的是Btree還是B+tree為什麼

結合MySQL中Innodb存儲引擎索引結構來看的話……
教科書上的B+Tree是一個簡化了的,方便於研究和教學的B+Tree。然而在資料庫實現時,為了更好的性能或者降低實現的難度,都會在細節上進行一定的變化。下面以InnoDB為例,來說說這些變化。
04 - Sparse Index中的數據指針
在「由淺入深理解InnoDB索引的實現(1)」中提到,Sparse Index中的每個鍵值都有一個指針指向所在的數據頁。這樣每個B+Tree都有指針指向數據頁。
如果數據頁進行了拆分或合並操作,那麼所有的B+Tree都需要修改相應的頁指針。特別是Secondary B+Tree(輔助索引對應的B+Tree), 要對很多個不連續的頁進行修改。同時也需要對這些頁加鎖,這會降低並發性。為了降低難度和增加更新(分裂和合並B+Tree節點)的性能,InnoDB 將 Secondary B+Tree中的指針替換成了主鍵的鍵值。
這樣就去除了Secondary B+Tree對數據頁的依賴,而數據就變成了Clustered B+Tree(簇索引對應的B+Tree)獨占的了。對數據頁的拆分及合並操作,僅影響Clustered B+Tree. 因此InnoDB的數據文件中存儲的實際上就是多個孤立B+Tree。
一個有趣的問題: 當用戶顯式的把主鍵定義到了二級索引中時,還需要額外的主鍵來做二級索引的數據嗎(即存儲2份主鍵)? 很顯然是不需要的。InnoDB在創建二級索引的時候,會判斷主鍵的欄位是否已經被包含在了要創建的索引中.
接下來看一下數據操作在B+Tree上的基本實現。
- 用主鍵查詢
直接在Clustered B+Tree上查詢。
- 用輔助索引查詢
A. 在Secondary B+Tree上查詢到主鍵。
B. 用主鍵在Clustered B+Tree上查詢到數據。
可以看出,在使用主鍵值替換頁指針後,輔助索引的查詢效率降低了。
A. 如果能用主鍵查詢,盡量使用主鍵來查詢數據。
B. 但是由於Clustered B+Tree包含了完整的數據,遍歷的效率比 Secondary B+Tree的效率低。如果遍歷操作不涉及到二級索引和主鍵以外的數據,則盡量使用二級索引進行遍歷。

- INSERT
A. 在Clustered B+Tree上插入一條記錄
B. 在所有其他Secondary B+Tree上插入一條記錄(僅包含索引欄位和主鍵)
- DELETE
A. 在Clustered B+Tree上刪除一條記錄。
B. 在所有Secondary B+Tree上刪除二級索引的記錄。
- UPDATE 非鍵列
A. 在Clustered B+Tree上更新數據。
- UPDATE 主鍵列
A. 在Clustered B+Tree刪除原有的記錄(只是標記為DELETED,並不真正刪除)。
B. 在Clustered B+Tree插入一條新的記錄。
C. 在每一個Secondary B+Tree上刪除原有的記錄。(有疑問,看下一節。)
D. 在每一個Secondary B+Tree上插入一個條新的記錄。
- UPDATE 輔助索引的鍵值
A. 在Clustered B+Tree上更新數據。
B. 在每一個Secondary B+Tree上刪除原有的記錄。
C. 在每一個Secondary B+Tree上插入一條新的記錄。
更新鍵列時,需要更新多個頁,效率比較低。
A. 盡量不用對主鍵列進行UPDATE操作。
B. 更新很多時,盡量少建索引。
05 – 非唯一鍵索引
教科書上的B+Tree操作,通常都假設」鍵值是唯一的「。但是在實際的應用中Secondary Index是允許鍵值重復的。在極端的情況下,所有的鍵值都一樣,該如何來處理呢?InnoDB 的 Secondary B+Tree中,主鍵也是此二級鍵的一部分。 Secondary Key = 用戶定義的KEY + 主鍵。
注意主鍵不僅做為數據出現在葉子節點,同時也作為鍵的一部分出現非葉子節點。對於非唯一鍵來說,因為主鍵是唯一的,Secondary Key也是唯一的。當然,在插入數據時,還是會根據用戶定義的Key,來判斷唯一性。按理說,如果輔助索引是唯一的(並且所有欄位不能為空),就不需要這樣做。可是,InnoDB對所有的Secondary B+Tree都這樣創建。
還沒弄明白有什麼特殊的用途?有知道的朋友可以幫忙解答一下。
也許是為了降低代碼的復雜性,這是我想到的唯一理由。
弄清楚了,即便是非空唯一鍵,在二級索引的B+Tree中也可能重復,因此必須要將主鍵加入到非葉子節點。
06 – <Key, Pointer>對

標準的B+Tree的每個節點有K個鍵值和K+1個指針,指向K+1個子節點。
而在「由淺入深理解索引的實現(1)」中圖. 9的B+Tree上,每個節點有K個鍵值和K個指針。InnoDB的B+Tree也是如此。
這樣做的好處在於,鍵值和指針一一對應。我們可以將一個<Key,Pointer>對看作一條記錄。這樣就可以用數據塊的存儲格式來存儲索引塊。因為不需要為索引塊定義單獨的存儲格式,就降低了實現的難度。
- 插入最小值
當考慮在變形後的B+Tree上進行INSERT操作時,發現了一個有趣的問題。如果插入的數據的健值比B+Tree的最小鍵值小時,就無法定位到一個適當的數據塊上去(<Key,Pointer>中的Key代表了子節點上的鍵值是>=Key的)。例如,在圖.5的B+Tree中插入鍵值為0的數據時,無法定位到任何節點。在標準的B+Tree上,這樣的鍵值會被定位到最左側的節點上去。這個做法,對於圖.5中的B+Tree也是合理的。Innodb的做法是,將每一層(葉子層除外)的最左側節點的第一條記錄標記為最小記錄(MIN_REC).在進行定位操作時,任何鍵值都比標記為MIN_REC的鍵值大。因此0會被插入到最左側的記錄節點上。

07 – 順序插入數據
標準的B-Tree分裂時,將一半的鍵值和數據移動到新的節點上去。原有節點和新節點都保留一半的空間,用於以後的插入操作。當按照鍵值的順序插入數據時,左側的節點不可能再有新的數據插入。因此,會浪費約一半的存儲空間。
解決這個問題的基本思路是:分裂順序插入的B-Tree時,將原有的數據都保留在原有的節點上。創建一個新的節點,用來存儲新的數據。順序插入時的分裂過程.
以上是以B-Tree為例,B+Tree的分裂過程類似。InnoDB的實現以這個思路為基礎,不過要復雜一些。因為順序插入是有方向性的,可能是從小到大,也可能是從大到小的插入數據。所以要區分不同的情況。如果要了解細節,可參考以下函數的代碼。

btr_page_split_and_insert();
btr_page_get_split_rec_to_right();
btr_page_get_split_rec_to_right();
InnoDB的代碼太復雜了,有時候也不敢肯定自己的理解是對的。因此寫了一個小腳本,來列印InnoDB數據文件中B+Tree。這樣可以直觀的來觀察B+Tree的結構,驗證自己的理解是否正確。

⑻ 按照存儲結構劃分,索引分為哪兩類各有何作用

聚集索引:對表在物理數據頁中的數據排列進行排序,然後重新存儲到磁碟上,表中的數據行只能以一種方式存儲在磁碟上,故一個表只能有一個聚集索引。創建任何非聚集索引之前必須創建聚集索引。

非聚集索引:具有完全獨立於數據行的結構,使用非聚集索引不會影響數據表中記錄的實際存儲順序。



(8)索引存儲塊擴展閱讀

優點

1.大大加快數據的檢索速度;

2.創建唯一性索引,保證資料庫表中每一行數據的唯一性;

3.加速表和表之間的連接;

4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

缺點

1.索引需要佔物理空間。

2.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。

⑼ 點陣圖索引的存儲原理

點陣圖索引對數據表的列的每一個鍵值分別存儲為一個點陣圖,Oracle對於不同的版本,不同的操作方式,數據生成均有差別.
對於8i,9i,
下面分3種方式來討論數據的插入:
a.一次插入一行,插入多行後,一次提交;
b.每插入一行,提交一次;
c.批量插入方式,一次提交;
對於第一種方式,觀察點陣圖索引的變化情況.
a.假設插入8行相同鍵值的數據,如果以每行方式插入,然後一次提交,則會生成8個點陣圖
SQL> Insert Into H病人掛號記錄(Id,No,號別,執行人) Values(1,'G000001',1,'張1');
1 row inserted
SQL> /
1 row inserted
SQL> /
1 row inserted
SQL> /
1 row inserted
SQL> /
1 row inserted
SQL> /
1 row inserted
SQL> /
1 row inserted
SQL> /
1 row inserted
SQL> commit;
Commit complete
SQL> alter system mp datafile 1 block 40028;
System altered
row#0[7847] flag: -----, lock: 0
col 0; len 3; (3): d5 c5 31 --鍵值'張1'
col 1; len 6; (6): 00 40 9c 54 00 00 --rowid的起始位置
col 2; len 6; (6): 00 40 9c 54 00 07 --rowid的終止位置
col 3; len 2; (2): c8 ff --點陣圖編碼
row#1[7802] flag: -----, lock: 0
col 0; len 3; (3): d5 c5 31
col 1; len 6; (6): 00 40 9c 54 00 08
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 2; (2): c8 03
row#2[7780] flag: -----, lock: 0
col 0; len 3; (3): d5 c5 32
col 1; len 6; (6): 00 40 9c 54 00 08
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 1; (1): 02
row#3[7758] flag: -----, lock: 0
col 0; len 3; (3): d5 c5 33
col 1; len 6; (6): 00 40 9c 54 00 08
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 1; (1): 03
row#4[7736] flag: -----, lock: 2
col 0; len 3; (3): d5 c5 34
col 1; len 6; (6): 00 40 9c 54 00 08
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 1; (1): 04
row#5[7714] flag: -----, lock: 2
col 0; len 3; (3): d5 c5 35
col 1; len 6; (6): 00 40 9c 54 00 08
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 1; (1): 05
----- end of leaf block mp -----
但是,下次再插入一行相同鍵值的數據時,會自動合並這8行點陣圖為一行點陣圖,並生成一個新的索引點陣圖行存放剛插入行的索引:
SQL> Insert Into H病人掛號記錄(Id,No,號別,執行人) Values(1,'G000001',1,'張1');
1 row inserted
SQL> commit;
Commit complete
SQL> alter system mp datafile 1 block 40028;
System altered
row#0[7847] flag: -----, lock: 2
col 0; len 3; (3): d5 c5 31
col 1; len 6; (6): 00 40 9c 54 00 00
col 2; len 6; (6): 00 40 9c 54 00 07
col 3; len 2; (2): c8 ff
row#1[7825] flag: -----, lock: 2
col 0; len 3; (3): d5 c5 31
col 1; len 6; (6): 00 40 9c 54 00 08
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 1; (1): 00
----- end of leaf block mp -----
b.數據每行提交方式,與上面的情況相似,但有一點不一樣,每提交一行,拷貝原來的點陣圖,生成新的點陣圖,並標記原來的點陣圖為已刪除,
標記為已刪除的點陣圖,只有索引塊需要分配新的點陣圖時,才會清除標記為已刪除的點陣圖,重用這些空間.
在8i,9i上實驗的結果,與ITPUB的<Oracle 資料庫性能優化>一書378頁一致.
如果1000條相同鍵值的數據插入,將生成125個包括8條記錄的點陣圖行.
c.第三種方式,批量插入數據,insert into H病人掛號記錄(Id,No,號別,執行人) select ***方式,
同一鍵值,只生成一次點陣圖,只有一個點陣圖.
SQL> Insert Into H病人掛號記錄(Id,No,號別,執行人)
Select 1,'G000001',1,'張1' From al
Union All
Select 2,'G000002',1,'張1' From al
Union All
Select 3,'G000003',1,'張1' From al
Union All
Select 4,'G000004',1,'張1' From al
Union All
Select 5,'G000005',1,'張1' From al
Union All
Select 6,'G000006',1,'張1' From al
Union All
Select 7,'G000006',1,'張1' From al
Union All
Select 8,'G000006',1,'張1' From al
Union All
Select 9,'G000006',1,'張1' From al;
SQL> commit;
Commit complete
SQL> alter system mp datafile 1 block 40028;
System altered
row#0[8006] flag: -----, lock: 2
col 0; len 3; (3): d5 c5 31
col 1; len 6; (6): 00 40 9c 54 00 00
col 2; len 6; (6): 00 40 9c 54 00 0f
col 3; len 3; (3): c9 ff 01
row#1[8030] flag: ---D-, lock: 2
col 0; NULL
col 1; NULL
col 2; NULL
col 3; NULL
----- end of leaf block mp -----
所以,點陣圖索引最好採用批量插入方式,這樣,每個鍵值只生成一個點陣圖.而單行數據插入方式,每個鍵值將每8行數據生成一個點陣圖.
10G的情況,則簡單得多.
上面3種方式,相同鍵值的插入,點陣圖的生成是一樣的,只有一個點陣圖,並且,每次提交時,並不會刪除以前的點陣圖,而是直接修改對應鍵值的點陣圖.
每次插入一行數據,插入9行後提交
row#0[7763] flag: ------, lock: 2, len=29
col 0; len 3; (3): d5 c5 31
col 1; len 6; (6): 00 00 00 00 00 00
col 2; len 6; (6): 00 40 ef f2 00 0f
col 3; len 8; (8): f9 e4 d5 dc bc 01 ff 01
----- end of leaf block mp -----
再批量插入9行數據並提交
row#0[7733] flag: ------, lock: 2, len=30
col 0; len 3; (3): d5 c5 31
col 1; len 6; (6): 00 00 00 00 00 00
col 2; len 6; (6): 00 40 ef f2 00 17
col 3; len 9; (9): fa e4 d5 dc bc 01 ff ff 03
----- end of leaf block mp -----
可以看出,10G對點陣圖索引的存儲進行了優化,一個鍵值在索引塊中只有一個點陣圖
注意,其中有些結論並不是完全正確的,可以自己實驗證明,另外,該文涉及的實驗沒有標明Oracle版本,不同的版本,結果有差異.

熱點內容
搜安卓手機如何 發布:2025-03-16 19:03:31 瀏覽:683
卡西歐相機存儲卡異常 發布:2025-03-16 18:54:10 瀏覽:914
69hz的電腦玩吃雞如何調配置 發布:2025-03-16 18:52:37 瀏覽:913
java的append 發布:2025-03-16 18:51:52 瀏覽:930
h5本地資料庫 發布:2025-03-16 18:43:59 瀏覽:593
編程器資源 發布:2025-03-16 17:59:48 瀏覽:903
加密軟體廠商 發布:2025-03-16 17:59:44 瀏覽:680
魚鉤怎麼樣配置 發布:2025-03-16 17:59:04 瀏覽:157
安卓手機怎麼設置快點 發布:2025-03-16 17:45:35 瀏覽:331
c語言字元串右對齊 發布:2025-03-16 17:42:35 瀏覽:131