什么是 !"
!" 是一个伪列,存放该行的物理存储地址,不是用户定义,而是系统自己给加
上的。对每个表都有一个 !" 的伪列,但是表中并不物理存储 !" 列的值。你可
以像使用其它列那样使用它,但是不能删除该列,也不能对该列的值进行修改、插入。一
旦一行数据插入表中,则 !" 在该行的生命周期内是唯一的,即使该行产生行迁移,
行的 !" 也不会改变。
!" 对访问一个表中的给定的行提供了最快的访问方法,通过 !" 可以直接
定位到相应的数据块上。我们创建一个索引时,该索引不但存储索引列的值,而且也存储
索引值所对应的行的 !",这样我们通过索引快速找到相应行的 !" 后,通过该
!",就可以迅速将数据查询出来,这就是使用索引查询时速度比较快的原因。
#正确使用索引
索引是一种特殊的表,存放索引键值和 ROWID,用来提高检索表数据的效率。通过索
引查找数据时先通过关键字的值找到对应的索引条目,然后根据 ROWID 来快速的定位表
的记录,所以通过索引查找时有额外的 I/O 操作,如果要检索的字段已经包含在索引字段
中,则不需要再通过 ROWID 到表中找出对应行的数据,减少 I/O 量。通常通过索引查询数
据比全表扫描要快,但检索的数据量超过一定的比例时(通常为表的记录数 10%),索引
查找会比全表扫描的效率更低,所以不能简单的以是否使用了索引来判断 SQL 语句性能好
坏,要具体的分析。
虽然使用索引能提高查询效率$但是我们也必须注意到它的代价:索引需要空间来存储;
对表进行 、"、" 操作时,索引也会被修改,有额外的磁盘
所以索引不是越多越好,关键是能否正确的使用$以下是使用索引的一些原则%
索引有个概念叫“可选择性”,如果该列多列的“唯一键的数量表中的行数”的比值越接
近 ,则该列的可选择性越高,在可选择性高的列上进行查询时,返回的数据就较少,索
引的效率也就越高。所以唯一索引比非唯一索引的效率高(索引列和常量比较时), 在唯
一索引和非唯一索引都存在的情况下, 会优先选择唯一索引,两个都是非唯一索
引的情况下, 优先选择可选择性高的索引。
在索引列进行计算将不能使用索引
如:&'()*+,-.**/0+,&,1(23
+&'()*+,-.**/04556+.,*789:3
注:如有必要可以建立基于函数的索引
参数值和索引列数据类型不一致将不会使用索引
如:+&'()*;+*.4+0;+*.4+.<=78:;
注:;+*.4+.<= 为 4*/ 型
索引中不存储 值(复合索引每列均为 时)$使用 将不会使用索引
如:+&'()*+,-.**/ 0,==++<+>?4&&;
在索引列上使用2@A7和 &< 和 将不会使用索引
如:&'()*+,-.**/0=5.2@3