索引深入理解索引提高查询速度的原因

来源:互联网 发布:淘宝怎样套现信用卡 编辑:程序博客网 时间:2024/06/08 17:09
1.索引是什么
index索引是帮助数据库高效获取数据的数据结构。  是1种数据结构

2.引入索引
无论是数据库查询数据,还是其他的程序查询数据利用到的查询数据必定涉及到相关的查询算法。
引入:如数据结构的顺序表中获取顺序数据一般地我们采用for循环来查询数据此算法的复杂度为o(n)           (可查阅算法复杂度说明)
如果在查询大量的数据是这种算法的效率很低,还好有二分法来取顺序的数据效率提高。
然而数据库的数据必然不可能是顺序的数据,存放数据我不一定要使用顺序表,在数据结构中有很多的数据结构,因此数据结构的诞生就是为了
配合相关的算法解决我们开计算机编程中遇到的性能和效率问题。而索引这种数据结构就是为了数据库数据查找的效率而诞生的数据结构


3.索引的底层数据结构是什么
现在数据库索引普遍使用的数据结构是 b+tree  oracle提供了很多种索引实现包括  b+tree索引、位图索引、函数索引、应用域索引、hash索引、分区索引


4.  索引的创建和删除


CREATE INDEX index_name ON table_name (column_list)


DROP INDEX index_name ON talbe_name

5.索引的误区

1.建立索引了可能oracle并没有用到索引
oracle的statistics没有做相关的配置或者statistics很久了
2.oracle判断索引效率比全盘扫描的效率低
oracle在评估是否使用索引时会参考CF和FF两个数据
CF(Clustering Factor):
主要是通过rowid来体现的,rowid是oracle的隐藏字段
通过判断rowid的存储位置来判断CF的大小 
CF的值越大,说明数据的rowid指向的数据块越多,要读这些数据会读对应的数据块,I/O的读取次数很多。
CF值越小,说明数据的rowid指向的数据块越少,读取数据时I/O的读取次数会很少。
因此CF值越大说明效率越低
在查找数据时,Orale会比较数据的rowid,如果这两个rowid不属于同一个数据块,那么cluster factor增加1;
如果CF的值接近数据块的值 那说明该表的数据是按索引方式存取的 
如果CF的值接近数据行的值,说明该表的数据不是按索引存取的

FF(Filtering factor)
sql语句所选择的结果集占总的数据量的百分比
通过Selectivity来理解
表示一个行集当中的一小部分行这个行集可以是基表,视图,或者一个join的结果集,或者一次group by操作
选择性受限于查询谓词,比如,last_name='Smith',或者一个联合谓词,比如,last_name='Smith' ADN job_type='Clerk'
一个谓词就像一个过滤器,从行集当中过滤掉某些行

通过oracle优化的相关算法来判断当前的语句使用索引是否合适

3.
  索引不是越多越好
特别是大量从来或者几乎不用的索引,对系统只有损害。OLTP系统每表超过5个索引即会降低性能。
单列索引不如复合索引有效率。
用于多表连结的字段,加上索引会很有作用。
4.对于频繁做添加删除操作的表在有一定的数据量之后要重建索引
以前的索引结构已经不适合这种量级数据,反而会降低效率
原创粉丝点击