Oracle 索引
Oracle 索引
主题
- 索引意义
- 索引特点
- 索引优点
- 索引缺点
- 使用索引的注意事项
索引意义
建立索引的意义,是为了在海量数据的情况下,提高数据的检索速度;
索引特点
索引树的高度较低。0层索引存放的是索引列的值和rowid,1层及以上索引存放的是索引块的指针。
索引里存放的是rowid和索引列的值,rowid存放的是索引所指向的行记录的物理地址。
索引是有序的。
索引优点
索引使用BTree数据结构,BTree有较快的查找算法,可以大大提高数据的检索速度。
索引是有序的,分组和排序的时可以减少排序时间。
索引比要检索或者排序的表小很多,足够在内存中一次性读取。通过索引确定了数据位置,可以直接读取磁盘中的数据块,减少磁盘IO操作。
索引缺点
索引是有序的,创建和维护索引的有序开销比较大。
索引只存储了索引列的值,存在回表查询的问题。
使用索引的注意事项
索引应该建在常用的连接的列上,主要是一些外健,可以加快连接速度。
索引应该建立在经常查询的列上,加快检索速度。
索引应该建立在经常需要排序的列上,因为索引是有序的。
索引应该建立在经常使用在where字句的列上,加快条件的判断。
索引的数量应该恰当,要合理控制索引的数量,索引的创建和维护开销大。
索引会影响更新。对表记录进行更新操作,会影响索引,需要维护索引的有序,开销大。insert操作,索引越多,插入越慢;delete操作,海量数据定位删除情况下,有索引较快,删除大量数据时有性能问题;update操作需快速定位,且修改不影响索引,性能影响较小。
查询返回大量字段时,索引效果不好,因为存在回表查询问题,比全表扫描的IO次数更多。尽可能去掉不必要的字段,若还有多个必要字段,采用组合索引可以避免回表。
组合索引的索引列数量最好不要超过三个。若都是等值查询,索引列顺序无影响。若有等值和范围查询,则等值查询在前,范围查询在后。
如果单列索引和组合索引的前置列一样,可以不建立单列索引。
频繁修改的列不应该建立索引,检索性能和修改性能是相互矛盾的。
创建索引时会把整张表锁住,创建完才释放锁。
设置分区索引,却用不到分区条件上,性能将下降。
位图索引建立在重复度低的列上,和频繁更新的表上,会有很大的性能问题。BTree树索引存储的是列值,位图索引存储的是比特值,所以位图索引体积小。唯一值越少越容易锁定,所以位图索引更新慢,会锁住。
在max,min列上建立索引,性能有很大的提升。因为索引是有序的,可以直接在头和尾处找到需要的最小值和最大值。
distinct去重操作影响性能,在插入数据时就确保不插入重复数据。
count统计操作,在统计列上建立索引会提高统计速度。
列运算会让索引失效,尽可能避免在索引列上进行列运算,可以转换成普通的SQL写法。
进行优化时,要考虑SQL语句的执行频率和重要性。