oracle 优化之索引

故事扮演 提交于 2019-12-06 00:01:37

索引是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.更新开销.注:索引列的增删改开销是很大的

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!