`

通过建立索引提高数据库查询速度的原理

阅读更多

索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能。



索引的管理成本

1、 存储索引的磁盘空间

2、 执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护

3、 在数据处理时回需额外的回退空间。



实际数据修改测试:

一个表有字段A、B、C,同时进行插入10000行记录测试

在没有建索引时平均完成时间是2.9秒

在对A字段建索引后平均完成时间是6.7秒

在对A字段和B字段建索引后平均完成时间是10.3秒

在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒

从以上测试结果可以明显看出索引对数据修改产生的影响



索引按存储方法分类

B*树索引

B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。

位图索引

位图索引储存主要用来节省空间,减少DB2对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。



索引按功能分类

唯一索引

唯一索引有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。



主关键字索引

主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。

一般索引

一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。





索引按索引对象分类



单列索引(表单个字段的索引)

多列索引(表多个字段的索引)

函数索引(对字段进行函数运算的索引)

建立函数索引的方法:

create index 收费日期索引 on GC_DFSS(trunc(sk_rq))

create index 完全客户编号索引 on yhzl(qc_bh||kh_bh)

在对函数进行了索引后,如果当前会话要引用应设置当前会话的query_rewrite_enabled为TRUE。

alter session set query_rewrite_enabled=true

注:如果对用户函数进行索引的话,那用户函数应加上 deterministic参数,意思是函数在输入值固定的情况下返回值也固定。例:

create or replace function trunc_add(input_date date)return date deterministic

as

begin

return trunc(input_date+1);

end trunc_add;



应用索引的扫描分类

INDEX UNIQUE SCAN(按索引唯一值扫描)

select * from zl_yhjbqk where hbs_bh='5420016000'

INDEX RANGE SCAN(按索引值范围扫描)

select * from zl_yhjbqk where hbs_bh>'5420016000'

select * from zl_yhjbqk where qc_bh>'7001'

INDEX FAST FULL SCAN(按索引值快速全部扫描)

select hbs_bh from zl_yhjbqk order by hbs_bh

select count(*) from zl_yhjbqk

select qc_bh from zl_yhjbqk group by qc_bh



什么情况下应该建立索引

表的主关键字

自动建立唯一索引

如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)

表的字段唯一约束

ORACLE利用索引来保证数据的完整性

如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)

直接条件查询的字段

在SQL中用于条件约束的字段

如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)

select * from zl_yhjbqk where qc_bh=’7001’

查询中与其它表关联的字段

字段常常建立了外键关系

如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)

select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’



查询中排序的字段

排序的字段如果通过索引去访问那将大大提高排序速度

select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)

select * from zl_yhjbqk where qc_bh='7001' order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包括qc_bh和cb_sx字段)

查询中统计或分组统计的字段

select max(hbs_bh) from zl_yhjbqk

select qc_bh,count(*) from zl_yhjbqk group by qc_bh



什么情况下应不建或少建索引

表记录太少

如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。而不用索引的情况下ORACLE会将所有的数据一次读出,处理速度显然会比用索引快。

如表zl_sybm(使用部门)一般只有几条记录,除了主关键字外对任何一个字段建索引都不会产生性能优化,实际上如果对这个表进行了统计分析后ORACLE也不会用你建的索引,而是自动执行全表访问。如:

select * from zl_sybm where sydw_bh='5401'(对sydw_bh建立索引不会产生性能优化)



经常插入、删除、修改的表

对一些经常处理的业务表应在查询允许的情况下尽量减少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。



数据重复且分布平均的表字段

假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。



经常和主字段一块查询但主字段索引值比较多的表字段

如gc_dfss(电费实收)表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作标志来具体查询某一笔收款的情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时间,从实际上分析一笔收款如果按收费序号索引就已经将记录减少到只有几条,如果再按后面的几个字段索引查询将对性能不产生太大的影响。



如何只通过索引返回结果

一个索引一般包括单个或多个字段,如果能不访问表直接应用索引就返回结果那将大大提高数据库查询的性能。对比以下三个SQL,其中对表zl_yhjbqk的hbs_bh和qc_bh字段建立了索引:

1 select hbs_bh,qc_bh,xh_bz from zl_yhjbqk where qc_bh=’7001’





执行路径:

SELECT STATEMENT, GOAL = CHOOSE 11 265 5565

TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 5565

INDEX RANGE SCAN DLYX 区册索引 1 265

平均执行时间(0.078秒)

2 select hbs_bh,qc_bh from zl_yhjbqk where qc_bh=’7001’

执行路径:

SELECT STATEMENT, GOAL = CHOOSE 11 265 3710

TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 3710

INDEX RANGE SCAN DLYX 区册索引 1 265

平均执行时间(0.078秒)

3 select qc_bh from zl_yhjbqk where qc_bh=’7001’

执行路径:

SELECT STATEMENT, GOAL = CHOOSE 1 265 1060

INDEX RANGE SCAN DLYX 区册索引 1 265 1060

平均执行时间(0.062秒)



从执行结果可以看出第三条SQL的效率最高。执行路径可以看出第1、2条SQL都多执行了TABLE ACCESS BY INDEX ROWID(通过ROWID访问表) 这个步骤,因为返回的结果列中包括当前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3条SQL直接通过QC_BH返回了结果,这就是通过索引直接返回结果的方法。



如何重建索引

alter index 表电量结果表主键 rebuild



如何快速新建大数据量表的索引

如果一个表的记录达到100万以上的话,要对其中一个字段建索引可能要花很长的时间,甚至导致服务器数据库死机,因为在建索引的时候ORACLE要将索引字段所有的内容取出并进行全面排序,数据量大的话可能导致服务器排序内存不足而引用磁盘交换空间进行,这将严重影响服务器数据库的工作。解决方法是增大数据库启动初始化中的排序内存参数,如果要进行大量的索引修改可以设置10M以上的排序内存(ORACLE缺省大小为64K),在索引建立完成后应将参数修改回来,因为在实际OLTP数据库应用中一般不会用到这么大的排序内存。
分享到:
评论

相关推荐

    关于数据库中的索引原理

    索引是数据库管理系统(DBMS)为了提高查询速度而采用的一种数据结构。它就像书籍的目录一样,帮助用户快速定位到所需的数据记录。 ##### 1.1 索引的分类 根据索引的数据存储方式不同,索引可以分为两大类:聚簇...

    基于合理索引的数据库查询优化研究.pdf

    随着数据量的不断累积,如何提高数据库查询效率成为了亟待解决的问题之一。本文将围绕“基于合理索引的数据库查询优化”这一主题展开讨论,重点介绍数据库索引的基本概念、作用以及两种主要索引结构(聚集索引与非...

    详解SQL数据库索引原理

    并非所有的字段都需要建立索引,合理选择索引字段和类型对于优化数据库性能至关重要。以下是一些选择和优化索引的建议: - 为经常出现在WHERE子句中的字段创建索引。 - 对于频繁进行范围查询的字段,考虑使用聚集...

    基于索引的数据库查询优化

    在SQL查询中,如果查询条件涉及到已建立索引的列,DBMS可以快速找到匹配的行,从而显著减少查询时间。 索引主要有以下几种类型: 1. 单列索引:针对单一列创建的索引,是最基础的索引类型。 2. 复合索引:由多个列...

    数据库中索引原理

    2. **范围查询**:对于需要频繁执行范围查询的列,例如日期范围查询,使用聚集索引可以避免全表扫描,显著提高查询速度。 3. **大数目的不同值**:当列中有大量不同的值时,非聚集索引更为合适,因为它们不会影响...

    数据库原理课程实验报告.doc

    创建索引可以显著提高查询性能,但也会占用额外的存储空间并可能影响数据插入和更新的速度。删除索引则会释放相应的存储空间。 这些实验涵盖了数据库管理系统的基础操作,对于初学者来说,通过实践可以深入理解...

    数据库原理实践报告视图、索引的建立和维护;

    在SC表的成绩列上建立索引,可以加快对学生成绩的查询速度。 5. **数据类型和数据完整性**: 数据类型定义了数据库中字段的类型,如数值、字符串、日期等。数据完整性是确保数据库数据准确无误的关键,包括实体...

    SQL 如何建立索引来加快数据库的查询

    在数据库管理中,索引是提高查询性能的关键工具。本文主要介绍了如何利用SQL来创建索引,以加快数据库的查询速度。 1. **什么是索引** 索引是一种特殊的数据结构,存储在数据库的磁盘上,包含对数据表中所有记录...

    数据库索引设计和优化

    选择性低的列不适合建立索引。 2. 索引维护:索引需要随着数据的增删改进行维护,因此要考虑操作频率和复杂度。 3. 分区索引:对于大数据量的表,可以通过分区将数据逻辑上分块,减少扫描的数据量,提高查询效率。 4...

    学校数据库ppt数据库原理,浅显易懂

    - 查询优化:通过索引、查询重构、缓存等手段提高查询速度。 - 表设计优化:合理设置数据类型、避免全表扫描、使用分区等。 这份“学校数据库ppt”可能涵盖以上部分或全部知识点,通过图文并茂的方式,使初学者...

    数据库系统原理与应用开发实例

    通过为经常查询的字段建立索引,可以显著减少数据检索的时间。然而,索引也有其代价,如占用额外的存储空间和可能影响写操作速度,因此,合理地创建和管理索引是一项需要技巧的任务。 事务处理是数据库系统中确保...

    《数据库原理》课后习题及答案.

    - 查询优化是选择最佳执行计划的过程,涉及索引、连接算法、子查询优化等策略,以提高查询速度。 9. **数据库恢复技术**: - 讲述如何处理系统故障或事务错误,通过日志记录和检查点机制实现数据一致性。 10. **...

    2021-数据库系统原理试题.docx

    索引是数据库系统中用于加快数据检索速度的重要工具,它通过建立数据结构来快速定位表中的数据行。然而,索引并非越多越好,因为索引的创建和维护会占用额外的存储空间,并且在更新数据库时还会增加成本。因此,需要...

    数据库原理答案04735

    7. **索引**:索引是数据库为了加速查询而创建的一种数据结构。它可以极大地提高数据检索速度,但也会占用额外的存储空间,并可能影响到数据插入和更新的速度。 8. **事务**:数据库事务是一组操作,这些操作被视为...

    数据库索引原理-个人开发体验总结

    数据库索引原理是数据库...总之,理解数据库索引原理,掌握聚族索引、主键和查询优化的运用,对于提高数据库性能和优化应用程序至关重要。通过不断实践和学习,我们可以更好地应对各种数据库挑战,实现高效的数据管理。

    数据库原理及应用(何玉洁)第二版

    4. **第16章**:可能涉及数据库的高级主题,如视图、索引、存储过程和触发器,这些都是提高数据库性能和实现复杂业务逻辑的重要工具。 5. **第13章**:可能讨论数据库的安全性与完整性,包括权限管理、角色、约束...

    数据库索引

    通过建立索引,可以显著减少查找的时间,因为索引会预先存储数据的关键信息,并以一种易于搜索的方式组织起来。 #### 二、索引的目的与优点 **目的:** - 加快表中记录的查询速度。 - 提高排序效率。 **优点:** ...

    数据库原理、编程与性能

    索引是加速数据检索的关键,正确地创建和使用B树、哈希或全文索引可以显著提升查询速度。事务处理保证了数据的一致性和完整性,而并发控制机制如锁和多版本并发控制(MVCC)则确保了多个用户同时访问数据库时的正确...

    数据库锁和索引实验

    基于函数的索引允许对计算字段或者经过特定函数处理的字段建立索引,使得在查询中可以利用这些索引,提高复杂条件下的查询速度。例如,我们可以通过对字符串进行不区分大小写的索引,实现大小写无关的搜索。在实验中...

    数据库原理与设计

    DB优化是从整体上提高数据库性能的过程。 **7.2.2 OS性能收集工具** 操作系统级别的性能监控工具可以帮助诊断数据库性能问题。 **7.2.3 性能视图** 性能视图提供了关于数据库性能的详细信息。 **7.2.4 ...

Global site tag (gtag.js) - Google Analytics