B-Tree 索引
本文来自网上整理 来自以下博客内容
http://www.360doc.com/content/13/0712/11/13136648_299364992.shtml;
http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html;
B-Tree index 也是我们传统上常见所理解的索引。B-tree (balance tree)即平衡树,左右两个分支相对平衡。
B树索引在Oracle中是一个通用索引。在创建索引时它就是默认的索引类型。B树索引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引。B树索引最多可以包括32列。
树叶块包含了索引值、ROWID,以及指向前一个和后一个树叶块的指针。Oracle可以从两个方向遍历这个二叉树。B树索引保存了在索引列上有值的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。如果索引是多个列的组合索引,而其中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。
Root为根节点,branch 为分支节点,leaf 到最下面一层称为叶子节点。每个节点表示一层,当查找某一数据时先读根节点,再读支节点,最后找到叶子节点。叶子节点会存放index entry (索引入口),每个索引入口对应一条记录。
Index entry 的组成部分:
Indexentry entry header 存放一些控制信息。
Key column length 某一key的长度
Key column value 某一个key 的值
ROWID 指针,具体指向于某一个数据
例子说明
SQL> create table dex (id int,sex char(1),name char(10)); Table created. --向表中插入1000条数据 SQL> begin for i in 1..1000 loop insert into dex values(i,'M','chongshi'); end loop; commit; end; / PL/SQL procedure successfully completed. 查看表记录 SQL> select * from dex; ID SE NAME ---------- -- -------------------- ... . ..... M chongshi M chongshi M chongshi M chongshi M chongshi M chongshi M chongshi M chongshi M chongshi M chongshi rows selected. --创建索引: SQL> create index dex_idx1 on dex(id); Index created. 注:对表的第一列(id)创建索引。 --查看创建的表与索引 SQL> select object_name,object_type from user_objects; OBJECT_NAME OBJECT_TYPE -------------------------------------------------------------------------------- DEX TABLE DEX_IDX1 INDEX SQL> create index dex_index2 on dex(sex,name); Index created. SQL> select object_name,object_type from user_objects; OBJECT_NAME OBJECT_TYPE -------------------------------------------------------------------------------- DEX TABLE DEX_IDX1 INDEX DEX_INDEX2 INDEX
上面这张图能更加清晰的描述索引的结构。
跟节点记录0至50条数据的位置,分支节点进行拆分记录0至10.......42至50,叶子节点记录每第数据的长度和值,并由指针指向具体的数据。
最后一层的叶子节是双向链接,它们是被有序的链接起来,这样才能快速锁定一个数据范围。
SQL> select * from dex where id>23 and id<32; ID SE NAME ---------- -- -------------------- 24 M chongshi 25 M chongshi 26 M chongshi 27 M chongshi 28 M chongshi 29 M chongshi 30 M chongshi 31 M chongshi 8 rows selected.
如上面查找的列子,通过索引的方式先找到第23条数据,再找到第32条数据,这样就能快速的锁定一个查找的范围,如果每条数据都要从根节点开始查找的话,那么效率就会非常低下。
B-tree 特点:
适合与大量的增、删、改(OLTP)
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;