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