日期:2014-05-16  浏览次数:20451 次

程序员对索引的误解

1、索引中最常见的就是B树索引,B树索引的实现与二叉查找树相似,但是B的意思不是binary,而是balance(平衡)。?

2、B树索引上的每个结点都是一个块,有叶子块和分支块之分。块中的数据包括各个索引以及一个rowid。走索引查询时,会按照树的分支将需要查询数据路径上的相应的分支块和叶子块读到内存。?

3、B树索引不存在非唯一性条目,在一个非唯一性索引中,Oracle会把rowid作为一个额外的列追加到键上,使得键唯一。非唯一性索引,会先按索引键值排序,然后按rowid升序排序。?

4、B树索引时高度平衡的,大多数情况,B树索引的高度都是2或3,即使索引数百万行记录也是如此。这说明,一般情况,在索引中找到键值只需2到3次IO(2到3个数据块)。?

5、通常有两种使用索引的方法:?
?(1)索引用于访问表中的行,访问表中很少一部分行。?
这是DBA给的经验值:?
小表(记录数小于10000行的表):筛选比例<10%;?
大表:(筛选返回记录数)<(表总记录数*单条记录长度)/10000/16?
????? 单条记录长度≈字段平均内容长度之和+字段数*2?
(2)索引用于回答一个查询,索引中的信息足够回答整个查询。

?

6、不能视图加索引,视图只是存储了一种查询,具体的访问还是要访问基表。

?

7、B树索引不会存储null的条目。

?

8、外键上要加索引,否则容易造成死锁。

?

9、组合索引,查询时只使用单一或没有加上全部的索引条件的查询。

?

10、count查询默认是会走B树索引的,但是如果索引建在可能为null的字段上,则不会走索引查询(因为B树索引不能允许null,使用索引查出的count和使用表查询出来的count可能1出现不一致情况)。

?

11、索引列上使用函数或使用数据类型转化函数,将会不走索引查询。

?

12、优化器拒绝使用索引查询,优化器绝大多数时候是英明的,不要贸然强制使用索引。

?

13、没有将最有差别的列放在索引最前面会使索引更小或更有效率的说法,实际上,如果使用索引键压缩,情况恰恰相反(即把没有差别的列放在索引最前面最优的做法)。