oracle 优化之索引
索引是sql优化的使用频度最高的武器
索引就是一种优化查询的工具,注意 是优化了查询.,但是他也影响了dml的速度变慢.
在了解索引的优点之前我们先看一下索引的结构,只有充分了解索引的结构,才能明白索引的机制和应用.
索引结构
根块--茎块---叶块
叶块;存储rowid+列植.索引存储列植的时候是有序排列,但是不存储空值,这是索引的重要属性
茎快:当产生两个叶块以上的时候 就会产生一个茎快来管理,这时候茎块只储存叶块的键值.
根块:当产生两个茎块以上的时候,就会产生一个根块来管理,这时候根块只储存茎块的键值.
索引运行方式
通过索引查询是首先通过键值 由根块找到叶块,根块-茎块-叶块找到rowid和列值.
索引三大特性
1.索引的高度较低
2.有序性
3.存储列值和rowid
理解了索引特性之后 就可以理解
1.索引列的聚合.注:因为索引里已经存储了列值所以索引列的聚合必然很快
2.索引列的排序.注:因为索引里已经存储了排序之后的列值所以排序也必然很快
索引扫描类型
1.index range scan
2.index full scan
3.index fast full scan
4.index unique scan
5.index full scan (max/min)
注:这里如果语句是这样的select max(id),min(id) from test 你会发现 执行计划走的是 index fast full scan 而不是 .index full scan (max/min)
没有走最快的index full scan (max/min)原因在于索引不能同时检索块的最小值和最大值
改写成 select max(id),min(id) from (select max(id) from test) a,(select min(id) from test) b 因为都是一列所以不怕笛卡尔积
在看执行计划就会发现 逻辑读大大降低
6.index skip scan
7.table access by index rowid
8.table access by user rowid 是最快的访问方式
这些是执行计划常见的index读入数据方式,需要体会他们的不同之处,才能更进一步
组合索引检索的时候最好第一列是等值第二列是范围 例子:create index mm on test(id, date) select * from test where id=1 and date>201910.
索引的不足之处
注意:建立索引虽然可以优化查询,但是会影响dml语句速度.
索引各种开销.
1.热快竞争
2.回表开销
3.建索引开销,注:因为需要保持有序性,建索引的开销也不可忽视
4.更新开销.注:索引列的增删改开销是很大的