唯一索引和非唯一索引ROWID儲存的區別
最近一直在思考這個問題,網上關於這個問題的帖子很多,自己就常用的B*樹索引專門做了個小測試。
SQL> conn / as sysdba
已連線。
SQL> create table t as select * from all_objects;
表已建立。
一、首先測試非唯一索引
SQL> create index idx_t on t(object_id,object_name);
索引已建立。
SQL> select header_file,header_block,blocks from dba_segments
2 where segment_name='IDX_T';
HEADER_FILE HEADER_BLOCK BLOCKS
----------- ------------ ----------
1 61825 384
SQL> alter system dump datafile 1 block min 61827 block max 61828;
系統已更改。
檢視最新生成的使用者跟蹤日誌TRC
Start dump data blocks tsn: 0 file#: 1 minblk 61827 maxblk 61828
buffer tsn: 0 rdba: 0x0040f183 (1/61827)
scn: 0x0000.0050a75f seq: 0x02 flg: 0x04 tail: 0xa75f0602
.............................................................................................................
row#148[4758] flag: ------, lock: 0, len=18
col 0; len 3; (3): c2 02 34
col 1; len 4; (4): 4c 4f 42 24
col 2; len 6; (6): 01 40 02 03 00 39
......................................................................................................
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 61827 maxblk 61828
二、首先測試唯一索引
SQL> drop index idx_t
2 ;
索引已刪除。
SQL> create unique index idx_t on t(object_id,object_name);
索引已建立。
SQL> select header_file,header_block,blocks from dba_segments
2 where segment_name='IDX_T';
HEADER_FILE HEADER_BLOCK BLOCKS
----------- ------------ ----------
1 61825 384
SQL> alter system dump datafile 1 block 61830;
系統已更改。
檢視最新生成的使用者跟蹤日誌TRC
Start dump data blocks tsn: 0 file#: 1 minblk 61830 maxblk 61830
buffer tsn: 0 rdba: 0x0040f186 (1/61830)
...............................................................................................................
row#12[7621] flag: ------, lock: 0, len=38, data:(6): 00 40 f1 0b 00 15
col 0; len 3; (3): c2 09 10
col 1; len 25; (25):
.............................................................................................................
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 61830 maxblk 61830
總結:注意以上紅色部分,它就是存的ROWID,但是在非唯一索引,ROWID作為單獨的一列新增到索引鍵中,而唯一索引的ROWID則是存到data(6)中,由此也可以證明B*樹索引中不存在非唯一條目。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25964700/viewspace-700453/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 唯一索引和普通索引MySql索引
- 唯一索引和普通索引的選擇索引
- 唯一索引索引
- MySQL <唯一索引>MySql索引
- 主鍵約束、唯一約束和唯一索引索引
- MySQL實戰45講——普通索引和唯一索引MySql索引
- 一條唯一索引索引
- 普通索引和唯一索引,應該怎麼選擇?索引
- Change Buffer 只適用於非唯一索引頁?錯索引
- 如何選擇普通索引和唯一索引《死磕MySQL系列 五》索引MySql
- mysql唯一索引是什麼MySql索引
- 【Mongo】mongos shard 唯一索引的問題Go索引
- [20211105]索引分裂塊清除日誌增加(唯一索引).txt索引
- 主鍵索引 (聚集索引) 和普通索引 (輔助索引) 的區別索引
- 資料庫表的唯一索引問題資料庫索引
- mysql的唯一索引不會利用change bufferMySql索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- [20211108]索引分裂塊清除日誌增加(唯一索引)2.txt索引
- 聚簇索引和非聚簇索引到底有什麼區別?索引
- MySQL:2020 端午節隨筆(索引下探和唯一索引特殊執行計劃)MySql索引
- mysql 新增時,唯一索引衝突時更新MySql索引
- Oracle與GreatSQL差異:更改唯一索引列OracleSQL索引
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- 索引儲存小記索引
- 技術分享 | MySQL 大表新增唯一索引的總結MySql索引
- 如何優雅的向MySQL唯一索引列增加值MySql索引
- MySQL中的聚簇索引和非聚簇索引MySql索引
- sqlserver索引重建和索引重組的區別和操作方法SQLServer索引
- [20201007]exadata儲存索引.txt索引
- [MySQL]為什麼非聚簇索引不儲存資料位置MySql索引
- MyBatisPlus解決邏輯刪除與唯一索引的相容問題MyBatis索引
- SQL Server索引 - 非聚集索引SQLServer索引
- hadoop異構儲存+lucene索引Hadoop索引
- 2_mysql(索引、儲存引擎)MySql索引儲存引擎
- 從InnoDB 索引執行簡述 聚集索引和非聚集索引、覆蓋索引、回表、索引下推索引
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- mysql索引型別Normal,Unique,Full Text區別以及索引方法Btree,Hash的區別MySql索引型別ORM
- 故障案例:MySQL唯一索引有重複值,官方卻說This is not a bugMySql索引
- Oracle GoldenGate 針對表沒有主鍵或唯一索引的解決方案OracleGo索引