`

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

阅读更多

索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高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数据库应用中一般不会用到这么大的排序内存。
分享到:
评论

相关推荐

    数据库索引原理及优化

    摘要 本文以MySQL数据库为研究对象,讨论...因为之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用一种高效的查询算法,最终提高数据的查询速度。 索引的本质 MySQL官方对索引的定义为:索引(Index)是

    Mysql千万级别数据优化方案

    在我们的测试中,我们发现建立索引可以明显提高查询速度。未创建索引时,SELECT 语句的执行时间为 13.396s,而创建索引后,执行时间减少到 2.896s。 2. 数据体现 在我们的测试中,我们还发现,使用适当的 SQL 语句...

    超市管理数据库课程设计大作业.doc

    《数据库原理与设计》课程设计 (含完整设计资料) 一、超市管理数据库 超市需建立一个管理数据库存储以下信息: *超市信息包括超市代号,超市名,经理名及超市运营开销。 *一个超市内有多个部门,每个部门有部门号...

    数据库系统概论chp3-2.pptx

    索 引 谁可以建立索引 数据库管理员 或 表的属主(即建立表的人) 谁维护索引 关系数据库管理系统自动完成 使用索引 关系数据库管理系统自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引 数据库系统...

    学生成绩管理系统数据库设计.doc

    学生成绩管理系统数据库设计 [提要] 一个好的数据库,不但可以提高数据查询效率,而且还可以保证数据的完整性和一致性 。所以,数据库在信息管理系统中有着非常重要的作用。本文介绍如何使用SQL Server 2005完成学生...

    基于协处理器的HBase内存索引机制的研究.pdf

    然而,原生的HBase数据库在进行数据查询时只支持主键索引,对非主键数据只能通过全表扫描的方式进行查询,极大降低了HBase的多条件查询速度。 为了解决这个问题,本文提出了基于协处理器的HBase内存索引构建方案。...

    MySQL索引建立选择和常见失效原因总结,这些你都得知道

    文章目录推荐阅读索引建立选择适合建立索引不适合建立索引索引失效原因使用索引注意...查询中排序的字段,排序的字段若通过索引去访问将大提升排序速度( 索引能够提高检索的速度和排序的速度) 查询中统计或分组的字段

    Linux文件搜索命令解析以及locate命令查询优化.pdf

    locate 命令的工作原理是通过建立一个文件索引数据库,数据库中存储了文件的 metadata,包括文件名称、时间、文件类型等信息。当用户使用 locate 命令搜索文件时,系统会根据文件索引数据库快速地搜索文件。 locate...

    数据库之图书管理系统实验报告.doc

    2)进一步提高建库、索引、查询、关联等数据库基本操作技术。 3)通过对功能模块的具体实现,得到面向对象的程序设计方法的初步训练。 4)通过分析、设计、实现的全过程训练,提高我们分析问题、解决问题的能力,培养 ...

    千金良方:MySQL性能优化金字塔法则.docx

    MySQL性能优化是指通过调整MySQL数据库的配置、优化数据库结构和查询语句等方式,提高MySQL数据库的性能和响应速度,以满足应用程序的需求。MySQL性能优化金字塔法则认为,MySQL性能优化的关键在于建立一个多层次的...

    深入理解 MySQL 索引底层原理

    深入理解 MySQL 索引底层原理 Mysql 作为互联网中非常热门的数据库,其...MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件

    数据库-教材订购系统.doc

    1) 安全性要求 安全性可先通过视图机制,不同的用户只能访问系统授权的视图,这样可提供系统数 据一定程度上的安全性,再通过分配权限、设置权限级别来区别对待不同操作者对数据 库的操作来提高数据库的安全性。...

    SQL查询安全性及性能优化

     使用*,由于没有明确指定要查询那些字段数据,数据库引擎要花费一定时间检索系统表,通过系统表[sysobjects、syscolumns]查询*代表那些字段  order by 后跟的字段尽量是索引字段,如果这个字段不是索引字段可以...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,主要面向中小企业 中小型企业 PostgreSQL 号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能也很...

    最新各大公司企业真实面试题-NewEgg.面试题.txt

    1. 索引的优势和建立索引考虑因素:索引可以提高查询速度,减少磁盘I/O,增加并发性能,但也需要考虑索引的维护、存储空间和查询优化等因素。 2. 存储过程的优势和不足:存储过程可以提高查询性能、简化复杂查询、...

    sql总结.doc

    一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速 度。 2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来 与数据库提供的事务...

    SQL Server的通用分页存储过程 未使用游标,速度更快!

    正常情况下,SQL Server服务器上会对使用频率大的Table建立合适的索引 这样能大幅度的提高数据库本身的数据检索速度,建立索引的方法就不细说了 如果需要返回大量数据,从几百行到几万行,甚至几十万行数据 这时会...

    大厂真题之乐信-Java高级.pdf

    数据库索引是提高查询效率的重要手段。常见的索引结构有B树和B+树等。 1. B树:B树利用磁盘块的特性构建树,每个磁盘块是一个节点,包含关键字。B树巧妙地利用磁盘预读原理,将一个节点的大小设为等于一页(每页为...

    SQL 优化原则

     在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前...

Global site tag (gtag.js) - Google Analytics