Oracle数据库----------------索引

关于Oracle数据的学习记录:

四十七、索引
下面为了方便观察问题,使用如下的一个查询操作
SELECT * FORM emp WHERE sal>2000;
只是一个最简单的限定查询,那么现在进一步分析以上查询做了什么事情

范例:进入sys用户,打开跟踪器
CONN sys/change_on_install AS SYSDBA;
SET AUTOTRACE ON;
下面切换回scott用户,重新查询
CONN scott/tiger ;
SET AUTOTRACE ON;
可以发现此时采用了全表扫描的模式(TABLE ACCESS FULL),它在进行这样查询的过程之中,会将过滤条件与数据表中每一行记录进行比较
那么现在可以试着想象一种情况,如果现在emp表里存在有5W条记录,但是从1.5W之后就没有了任何记录符合我们的查询条件了,也就是说如果按照全表扫描的模式意味着要查询无用的3.5W行记录
首先可以想到的方式就是排序,但是即便排序了,ORDER BY并不会影响到WHERE子句的执行,它在最后执行,于是可以采用树的形式完成排序的方式
为了树好看一点,假设工资的记录数据:1500、1100、1250、1300、950、800、2850、2450、2975、1600、3000

发现此时不再需要查询全部的数据记录,而只需要根据数值比较查询有限多个数据即可,而这样的查询就属于索引的支持,也就是说如果使用了索引,那么就需要在数据之外维持一个内存空间,这个空间要保留有以上树的排序关系

范例:创建索引
CREATE INDEX emp_sal_ind ON scott.emp(sal);
在scott.emp表的sal字段上设置一个索引
再次执行查询:
SELECT * FORM scott.emp WHERE sal>2000;
SET AUTOTRACE ON;

TABLE ACCESS BY INDEX ROWID
INDEX RANGE SCAN
现在发现一旦加入索引机制,那么不再执行全表扫描的操作,而是使用索引进行了查询,但是这个索引也只是针对sal字段起作用
通过分析,可以发现索引可以提升数据的查询性能
现在有一个问题出现了,索引如果要想正常使用,实际上并不是扫描数据表,而是扫描索引数据(B*Tree),如果说现在有雇员的工资数据被改变了,索引树的内容一定要发生改变,如果此时表中的数据量非常庞大,那么每一次树的改变一定会消耗大量的内存空间,如果表中的数据要被频繁修改的话,那么索引就变成了拖累,反而会降低整个数据库的性能,所以索引的使用要慎重

实际情况:有一个数据库,假设有3亿条数据,里面的数据平均每秒会更新2-3次,但是由于信息检索的需要,此数据库必须保持快速的数据检索需要与数据统计的需要,那么请问如果你是设计者,怎么解决这个问题?
需求的矛盾点:如果要想更新迅速,那么不能使用索引,如果要想检索迅速,那么就必须使用索引
**方式一(土豪级):装备一台超级电脑
**方式二(屌丝级):此时只能牺牲实时性,延缓新数据的统计,在数据库里面准备两张表,一张表专门留给用户进行数据的更新使用,并且记录号更新的日志,而另外一张数据表,可以设置索引,实现信息的快速检索,可以在夜间的时候或者人少的时候实现数据的汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值