数据库开发小知识普及三:
1.Oracle BTREE索引的结构
Oracle BTREE索引的结构是由Root(根块)、Branch(茎块)和Leaf(叶子块)三部分组成的。其中,Leaf(叶子块)主要存储了key column value(索引列具体值),以及能具体定位到数据块所在位置的rowid。Root(根块)和Branch(茎块)存储的是子节点的位置信息。
如图所示,BTREE索引结构的三大重要特点:
(1)索引的高度较低
(2)索引存储列值
(3)索引本身有序
2.索引回表与优化
(1)什么是索引回表读(TABLE ACCESS BY INDEX ROWID)?
当SQL通过索引找到指定索引列值的信息,在此索引块上不能读到该列以外的其他列的值,需要根据索引块中对应的rowid定位到表所在的数据块,然后从数据块中获取该行其他字段的记录,这就是TABLE ACCESS BY INDEX ROWID的含义。因此,减少索引回表读,可以减少查询的io消耗,提升sql的执行性能。
(2)如何减少索引回表?
a.首先,避免 select * 或者select 全部字段 这种SQL写法。只查询需要的字段。
b.SQL优化时,如果能根据业务需求,将多余的字段去除,恰好只查询索引字段,实现索引覆 盖,即可避免回表读操作。
c.如果某些字段不能取消展现,考虑创建联合索引的方式来避免回表。注意,如果联合索引的联合列太多,必然导致索引过大,虽然消除了回表动作,但是索引块变多,在索引中的查询可能要遍历更多块。因此联合索引列不宜过多,一般超过3个字段组成的联合索引都是不合适的。