【道森试听】索引——道道老师

来源:互联网 发布:精英情结知乎 编辑:程序博客网 时间:2024/04/27 23:21


多快读,默认20个

何为OLTP,OLAP?事务型(关系型数据库),分析型(针对数据仓库)

OLTP以业务为主,e.g.邮箱公司,主要业务:收发邮件,对数据库做插入操作。倾向于管理。

OLAP有很多数据库、数据,将数据转化为所需要的,进行分析,得出经营策略(决策分析系统),倾向于查询分析。


索引作用:使查询更快


全表扫描:

影响所有数据库现在主要的瓶颈是什么?——I/O

多快读:什么样才是最合适的,需要考量!


3大要素影响多块读 :

第一: 区头会导致断;

第二: cache会导致断;

第三:区与区之间的间隔

(cached表示已经缓存在buffer cache里面的数据块 )

区头:管理区,段头:管理端

一般多快读是128个。全表扫描一次最多可以扫描128个块。


Rowid:对于行的唯一标示,可以最快找到你想要的行。


想要随机数时可用这个动态采样数据。一般很少用到。


上图为索引的逻辑图


最主要功能:约束(unique约束or primary key约束)

如果我建立一个普通索引很慢,那么我是不是建立一个唯一索引会快呢? 错!快不了多少的。最多少了一点点cpu开销而已 。


普通索引

在什么时候退出扫描呢?在不满足条件的时候。

使用相同索引字段的情况下,唯一索引和普通索引,除了唯一约束,其它无差别。


存储的值不是原来的列值,而是函数运算后的值,通过外层运算定位到该值。


核心:按照索引顺序查找。

看到了索引的顺序了吗? order by deptno

is null 不走索引

e.g.

select * from t where a=5 ; a可空
如果我在a列有索引,那么这个查询会走索引吗?

答:a=5 的时候,就相当于a =5 and a is not null;也就是它是可以走索引。


索引快速全表扫描:Index Scan(Fast Full)

与全扫描区别:无序与有序


Discard丢弃 R(root),B(branch)

select a from t ; a有索引

a的数据存了两份——表&索引

假如T表有100列

通过索引读出a



对第一列进行穷举法

比如说我有个这样的查询:
select * from t where b=2; 组合索引是(a,b) 

数据库会怎么做?——a列的值给穷举出来,比如说如果你a列有1,2,3,

穷举过程:

select * from twhere b=2 and a=1

union all

select * from twhere b=2 and a=2

union all

select * from twhere b=2 and a=3;


如果有两个表都有(a,b)组合索引,那么我进行

select * from t1 where a=2 and b=3;
select * from t2 where b=3 and a=2;

请问效率是不是一样的?一样的!


组合索引存储的值可以认为是一个组合键存储!

如果建立两个这样的索引:(a,b) and (b,a)

我们的查询是这样的 :

select * from t where a=2;
select * from t where b=2;

1、索引(a,b)

第一个是走范围扫描,第二个走跳跃式扫描

2、索引(b,a)

第一个是走跳跃式扫描,第一个是走范围扫描


索引全扫描 和 索引快速全扫描  哪个效率高?快速全索引扫描比普通索引扫描速度快是因为快速索引扫描能够多块读取,并且能并行处理

我是要按照顺序读取的时候,应走索引全扫描。

索引全扫描在实际中的例子:取排序后的前十行:

select * from (select * from t  order by a desc) t1 where rownum <=10;

 

我如果建立了a列索引,又建立了b列索引,那么我查询的时候,比如这样
select * from t where a=2 and b=3;

能否走两个索引?

答:可以。Index join scan。通过Rowid join。


hint:/*+ <hint> */ 

为什么会引出hint个操作?为了最优!有时机器不如人!


index_combine


访问获取rowid再访问表,已经逐渐被index_combine取代。

实际中,位图索引适用什么情况?组合条件有多重组合的时候,且distinct值不多。因为不确定,所以我们无法建立组合索引。

在实践中,有下拉选择条件,可选也可不选的情况。OLAP

什么时候并不适合位图索引?并有并发(DML)事务,且distinct值很多。

--DML(甄筛改查)包括select。


e.g.男和女(各50%)这种列 a (男,女),a列建立了位图索引

select * from t where a='男'  ,男女是各个50%,50%,不适合位图索引,全表扫描就行了。

select * from t where a=5 and b=6 and c=7 and d=8;这个时候是a,b,c,d分别建立位图索引效率高,还是组合索引效率高?组合索引

那么如果是这种情况呢:

select * from t where a=1 and b=3 and c=2;

select * from t where a=2 and c=3 and d=2;

select * from t where b=2 and c=3 and d=5;

位图索引效率高!


位图索引结构:树形结构,与B-tree区别是叶子节点不同。

0、1运算



原创粉丝点击