索引的使用规则与性能调优
数据库索引优化

数据库索引优化数据库索引是提高数据库查询性能的重要手段之一。
当数据库中的数据量逐渐增大时,索引的优化就显得尤为重要。
本文将介绍数据库索引的概念、作用,以及常见的索引优化方法和注意事项。
一、数据库索引的概念与作用数据库索引是对数据库表中一列或多列的值进行排序的结构,以便提高针对这些值的查询速度。
它类似于书籍的目录,可以帮助快速定位到特定的数据行。
索引可以大大减少数据库的查询时间,提高系统的性能。
索引的作用主要体现在以下几个方面:1. 提高查询速度:通过根据索引值的顺序进行快速检索,可以大大减少数据库查询的时间。
2. 加速排序操作:对于需要排序的列,索引可以提供预排序,从而加速排序操作。
3. 约束数据完整性:索引可以用于设置唯一性约束和外键约束,确保数据的完整性。
二、索引优化方法1. 合理选择索引列:选择那些经常被查询的列作为索引列,可以提高查询效率。
同时避免选择过多的索引列,过多的索引会增加写操作的开销。
2. 考虑索引的顺序:对于组合索引,需要根据实际查询的顺序进行考虑。
将最常用的列作为索引的前缀,可以提高查询效率。
3. 考虑索引的覆盖:如果某个查询只需要使用索引列的数据,那么可以使用覆盖索引来避免访问真实数据行,从而提高查询效率。
4. 避免过度索引:过多的索引不仅会增加数据库的存储空间,还会导致增删改操作的性能下降。
因此需要避免过度索引,只选择重要的列进行索引。
5. 定期维护索引:随着数据的增加、修改和删除,索引的性能也会逐渐下降。
因此需要定期对索引进行维护,包括重建索引、压缩索引碎片等。
三、索引优化注意事项1. 避免冗余索引:冗余索引是指多个索引包含相同的列或相同的列组合。
冗余索引不仅会浪费存储空间,还会降低查询和写操作的性能。
2. 注意索引的选择性:选择性是指索引列中不重复的值所占的比例。
索引的选择性越高,查询效率就会越高。
因此需要注意选择性,避免选择选择性较低的列作为索引列。
3. 注意索引的大小:索引的大小会直接影响到数据库的性能。
Oracle 索引的使用规则与性能调优

Oracle 索引的使用规则与性能调优索引分类逻辑上:Unique 唯一索引物理上:B-tree:Normal 正常型B树Bitmap 位图索引索引结构:B-tree:适合与大量的增、删、改(OLTP);不能用包含OR操作符的查询;适合高基数的列(唯一值多)典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;Bitmap:适合与决策支持系统;做UPDATE代价非常高;非常适合OR操作符的查询;基数比较少的时候才能建位图索引;树型结构:索引头开始ROWID,结束ROWID(先列出索引的最大范围)BITMAP每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID 有值;B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的5%,当然这只是个相对的比率,适用于一般的情况。
bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。
索引就好象一本字典的目录。
凭借字典的目录,我们可以非常迅速的找到我们所需要的条目。
数据库也是如此。
凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表。
虽然说,在表中是否创建索引,不会影响到Oracle数据库的使用,也不会影响数据库语句的使用。
这就好像即使字典没有目录的话,用户仍然可以使用它一样。
可是,若字典没有目录,那么可想而知,用户要查某个条目的话,其不得不翻遍整本字典。
数据库也是如此。
若没有建立相关索引的话,则数据库在查询记录的时候,不得不去查询整个表。
当表中的记录比较多的时候,其查询效率就会很低。
所以,合适的索引,是提高数据库运行效率的一个很好的工具。
不过,并不是说表上的索引越多越好。
过之而不及。
故在数据库设计过程中,还是需要为表选择一些合适的索引。
数据库管理软件的索引优化与查询性能调优方法

数据库管理软件的索引优化与查询性能调优方法章节一:引言随着数据量的急剧增长,数据库管理软件成为管理和存储大量数据的关键工具。
而索引优化和查询性能调优是保证数据库系统性能的核心问题。
本文将深入探讨数据库管理软件的索引优化和查询性能调优的方法。
章节二:数据库索引的基础概念2.1 索引的定义:索引是一种数据结构,用于加快数据库查询速度。
2.2 索引的类型:主键索引、唯一索引、普通索引、全文索引等。
2.3 索引的优缺点:提高查询速度、降低插入和更新性能、增加存储空间等。
章节三:数据库索引优化的方法3.1 合理选择索引:根据业务需求和数据特点选择适当的索引。
3.2 减少索引数量:过多的索引会增加磁盘空间和更新开销。
3.3 索引列的顺序:根据查询的频率和频度,将查询频率高的列放在前面。
3.4 索引列的数据类型:尽量选择小数据类型作为索引列。
3.5 索引列的长度:尽量选择较短的列作为索引列,以减少磁盘空间占用。
章节四:查询性能调优的方法4.1 SQL语句的优化:避免使用SELECT *,使用JOIN代替子查询等。
4.2 索引覆盖:利用索引的数据来满足查询需求,减少磁盘IO 操作。
4.3 查询计划优化:通过修改查询顺序、调整连接类型等方法来优化查询计划。
4.4 数据库分区:将大表分成多个小表,提高查询效率。
4.5 缓存机制的优化:合理设置缓存大小、清理过期缓存等。
章节五:数据库索引优化和查询性能调优的工具5.1 数据库性能监控工具:用于监控数据库的运行状态和性能指标。
5.2 数据库调优工具:自动诊断并优化数据库性能问题。
5.3 数据库索引分析工具:用于分析索引的使用情况和性能影响。
章节六:案例分析6.1 案例一:某公司数据库查询性能低下的优化6.2 案例二:某电商网站索引优化的实践章节七:总结与展望7.1 总结本文的主要内容和观点7.2 展望未来数据库管理软件索引优化和查询性能调优的发展方向本文主要讨论了数据库管理软件的索引优化与查询性能调优方法。
MySQL 索引使用有哪些注意事项

MySQL 索引使用有哪些注意事项在使用MySQL索引时,有一些重要的注意事项,以确保索引的有效性和性能优化:1. 选择合适的列:•选择需要经常用于检索、过滤或排序的列作为索引列。
避免对不经常用于查询的列创建索引,以免增加维护成本和降低性能。
2. 使用前缀索引:•对于较长的字符串列,可以考虑使用前缀索引,以减小索引的大小,提高查询性能。
3. 避免过度索引:•不要为每一列都创建索引。
过多的索引可能导致性能下降,因为每次插入、更新或删除时都需要维护索引。
4. 考虑复合索引:•在多个列上创建复合索引,以支持多列的查询条件。
然而,避免创建过于复杂的复合索引,因为它可能不会被有效利用。
5. 小心使用全文索引:•全文索引适用于对文本进行搜索的场景,但并不是所有的应用都需要它。
使用前要仔细评估,并确保它对性能有积极影响。
6. 避免在列上进行计算:•如果可能,避免在索引列上进行计算或函数操作,这会导致索引失效,无法有效使用。
7. 定期重新构建索引:•针对表的数据变更频繁的情况,定期重新构建索引以保持其性能。
8. 监控索引性能:•使用MySQL的性能监控工具,如EXPLAIN语句,来分析查询执行计划,以确保索引得到了正确的使用。
9. 避免在大表上使用ORDER BY:•在大表上使用ORDER BY可能会导致性能问题,因为它可能需要对整个结果集进行排序。
考虑使用合适的索引来优化ORDER BY。
10. 理解索引的存储成本:•索引会占用额外的存储空间,需要权衡存储成本和查询性能。
11. 了解不同类型的索引:• MySQL支持多种类型的索引,包括B树索引、哈希索引等。
了解不同类型索引的特性,选择适合场景的索引类型。
12. 在开发和测试环境中进行优化:•在生产环境之前,建议在开发和测试环境中进行索引优化,并使用模拟的工作负载来评估性能。
这些注意事项有助于确保索引的有效性,提高数据库的查询性能和整体性能。
在具体场景中,需要根据数据库的实际情况进行适当的调整和优化。
如何进行高效的数据库索引优化

如何进行高效的数据库索引优化数据库索引是提高查询性能的重要手段之一。
通过正确使用索引,可以减少数据库的IO操作,提高查询效率。
下面将介绍一些高效的数据库索引优化的方法。
1.基本的索引优化原则-唯一性:根据数据表的唯一性约束,创建唯一索引,以保证数据的一致性和完整性。
-选择适当的列:在创建索引时,选择有重复值、经常查询或者范围查询的列,可以提高索引的效率。
-索引覆盖:尽量使用索引满足查询需求,避免使用全表扫描,提高查询效率。
2.表结构优化-商定数据类型:选择适当的数据类型,可以减小存储空间,提高索引效率。
-表分解:当表数据过大时,可以进行表分解,将相对不常用的列分解到独立的表中,减小主表的大小,提高索引效率。
3.索引类型选择- B-Tree索引:适用于查询条件是等值查询或范围查询的情况,对于数据有序的列,如日期、数字等,B-Tree索引效果较好。
-哈希索引:适用于等值查询较多的情况,哈希索引可以直接定位到存储区域,比B-Tree索引更快。
但是,哈希索引不支持范围查询。
-全文索引:适用于全文搜索的场景,如文章的关键字搜索。
-空间索引:适用于地理信息查询、位置服务等场景,可以优化空间查询的性能。
4.索引的创建和维护-避免过多的索引:太多的索引会增加索引维护的开销,也会降低更新操作(如插入、删除、更新)的性能。
在开发过程中要谨慎选择创建索引的字段。
-定时维护索引:经常进行索引的重建和优化,保证索引的最新状态,提高查询性能。
-删除不必要的索引:定期检查和分析索引的使用情况,删除不再使用或者无效的索引。
5.统计信息的收集和更新-更新统计信息:统计信息对于查询优化至关重要。
定期收集和更新统计信息,以便数据库优化器生成更好的执行计划。
-执行计划的分析:分析查询的执行计划,根据执行计划优化查询语句、索引或者表结构。
6.查询优化技巧-减少全表扫描:避免在查询中使用不带索引的列,使用索引尽量覆盖查询的需求。
-提高查询的可重用性:对于经常使用的查询,将其封装成存储过程或函数,可以避免重复的编译和解析过程,提高查询效率。
索引的用法和原理

索引的用法和原理索引是一个重要的数据结构,常用于加快对数据的检索和搜索,包括文本搜索和数据库检索。
本文将介绍索引的用法和原理。
一、索引的定义索引是一个数据结构,它存储了数据的某些属性的值和对应的物理位置或指针。
通过索引可以更快速地访问数据,因为索引可以减少需要检索的数据量。
二、索引的作用1. 快速查找索引可以加速数据的查找和搜索,减少了查询时扫描全部数据的时间和资源消耗。
2. 提高更新速度索引可以有效地减少更新数据时需要的扫描数量,从而提高更新的速度。
3. 减少磁盘I/O次数索引可以减少访问磁盘的次数,降低磁盘I/O的消耗。
三、索引的类型1. B+树索引B+树索引是一种常见的索引类型,它是一棵平衡的树结构,具有时间复杂度为log(n)的查询和插入操作。
2. 哈希索引哈希索引是一种将键映射到散列表中的索引类型。
它具有常数时间的查询和插入操作,但不支持范围查询和排序。
索引一般采用B+树等树结构的数据结构,具有快速查找和排序的优势。
B+树的叶子节点存储实际的数据记录,而非叶子节点只存储记录的指针或物理地址。
这样可以减少磁盘I/O 的数量,提高索引的性能。
索引的维护是一种动态操作,包括索引的创建,更新和删除。
当数据变化时,需要对索引进行相应的调整,以保持索引的正确性和高效性。
3. 索引的优化为了提高索引的性能和效率,需要对索引进行优化。
可以通过使用覆盖索引减少需要的I/O次数,对于经常扫描的数据可以使用位图索引等。
五、索引的注意事项1. 索引过多会影响性能索引过多会影响写入性能,并且增加了索引维护的成本。
2. 索引的最佳实践在设计索引时,应根据数据的访问模式和查询需求调整索引的属性和数量。
对于经常使用的查询,可以采用复合索引等技术提高查询效率。
在使用索引时,应选择适当的索引类型和数据结构。
哈希索引适用于等值查询,而B+树索引适用于范围查询和排序。
总结:索引是一种重要的数据结构,可以加速数据的查询和搜索。
数据库性能调优方法
数据库性能调优方法1.使用索引:索引是数据库中的一种数据结构,能够快速定位到符合特定条件的数据,可以大大提高查询的性能。
在设计数据库时,需要根据查询的字段和频率来选择合适的索引类型,并注意对索引的维护和更新。
2.优化SQL查询语句:SQL查询语句是数据库性能的关键因素之一、需要合理地设计SQL查询语句,避免过多的关联查询和子查询,使用合适的查询条件来过滤数据,减少不必要的查询和数据传输。
3.使用批量操作和事务:将多个相同类型的操作合并为一个批量操作,可以减少与数据库的交互次数,提高性能。
同时,使用事务来确保数据的一致性和完整性,避免不必要的回滚和锁定。
4.优化表结构和数据类型:合理地设计表的结构和数据类型,可以减少存储空间的占用和数据的冗余。
使用合适的数据类型可以提高查询和计算的效率,减少存储和内存的使用。
5.调整数据库参数:数据库的性能与数据库参数的设置有很大关系。
需要根据具体的需求和硬件配置,合理地调整数据库的缓冲区、连接数、并发控制等参数,以提高数据库的运行效率。
6.定期维护数据库:定期进行数据库的维护工作,包括数据压缩、重建索引、统计和分析等,可以提高数据库的性能和响应速度。
同时,及时清理无用的数据和日志,减少数据库的存储空间。
7.分区和分表:当数据库的数据量达到一定规模时,可以考虑将数据进行分区或分表处理,将大的表分解为多个较小的表,来提高查询和维护的效率。
8.缓存技术:使用缓存技术可以减少对数据库的访问次数,提高系统的响应速度。
可以使用内存数据库、分布式缓存等技术来实现缓存。
9.定位和解决性能问题:使用性能监控工具和日志分析工具,定位并解决数据库中的性能问题。
可以分析数据库中的慢查询、阻塞等情况,进行优化和调整。
10.水平扩展和垂直扩展:当数据库性能无法满足需求时,可以考虑水平扩展和垂直扩展。
水平扩展是将数据库分布到多台服务器上,每个服务器处理部分数据和请求;垂直扩展是增加数据库服务器的处理能力,如增加CPU、内存等。
oracle索引优化原则
oracle索引优化原则Oracle索引是数据库优化中非常重要的一部分,它们能够在查询数据时提高查询效率和性能。
然而,在使用Oracle索引时,需要遵守一些原则,以便最大程度地提高查询效率和性能。
以下是一些Oracle索引优化的原则。
1.只在需要时使用索引Oracle索引能够帮助我们提高查询效率和性能,但它们也会降低更新和插入数据的速度。
因此,我们应当仅在需要时使用索引。
如果使用过多的索引,会导致查询语句变得复杂并且更新和插入速度变慢,从而影响整个数据库系统的性能。
2.使用唯一性索引唯一性索引可以帮助我们避免重复数据的插入和更新。
当数据库表中的某个列需要具有唯一性时,我们可以使用唯一性索引来实现。
这将确保同一列中的值不重复,从而提高整个数据库系统的性能。
3.使用复合索引如果查询语句需要同时查询多个列,我们可以使用复合索引来提高查询效率和性能。
使用复合索引时,需要注意索引的顺序,应该从前往后按照查询条件的顺序构建索引。
这样可以避免Oracle优化器无法使用索引而导致的全表扫描。
4.选择正确的索引类型Oracle提供不同的索引类型,包括B树索引、位图索引、函数索引等。
在选择索引类型时,我们应当根据查询语句的类型和数据的特点来选择最适合的索引类型。
例如,如果查询语句需要对大量的布尔类型或枚举类型数据进行查询,那么位图索引可能比B树索引更适合。
5.避免过度索引化过多的索引将会降低数据库系统的性能,每个索引都需要消耗一定的内存和磁盘空间,使得查询和更新操作变得更慢。
因此,我们应避免对相同的列建立多个重复的索引,并仅为确实需要的列创建合适的索引。
6.定期维护索引当数据表中的数据发生变化时,索引也需要随之更新。
因此,我们需要定期进行索引维护和优化,以确保索引数据与实际数据的一致性。
这样可以避免索引中出现“死数据”,也可以提高查询效率和性能。
在某些情况下,Oracle优化器会选择错误的索引,从而影响查询效率和性能。
数据库索引的维护与优化技巧
数据库索引的维护与优化技巧数据库索引是提高数据库查询性能和数据检索效率的重要手段。
然而,在大量数据的情况下,使用不当的索引或索引的维护不完善会导致性能下降甚至崩溃。
本文将介绍一些数据库索引的维护和优化技巧,以帮助开发人员有效提升数据库的性能。
1.选择合适的索引在创建索引时,需要选择适合的字段作为索引列。
通常情况下,那些经常用于查询条件的字段应该作为索引列。
例如,在用户表中,根据用户名进行查询的频率很高,那么可以考虑为用户名列创建索引。
然而,过多的索引也会降低写操作的性能,因此需要权衡和选择。
2.避免冗余索引冗余索引是指多个索引覆盖相同的查询。
在实际应用中,由于人为疏忽或者维护失误,可能会创建相似的索引。
这不仅浪费了存储空间,还降低了修改数据时的性能。
因此,在设计数据库时,需要避免创建冗余索引,可以通过审查现有索引来识别和删除冗余索引。
3.使用组合索引组合索引是指由多个列组成的索引。
当多个列常常同时出现在查询条件中时,使用组合索引可以提高查询效率。
例如,在订单表中,同时根据订单日期和订单状态进行查询,可以为这两个字段创建组合索引。
组合索引更适用于查询频繁的列组合,可以减少索引的个数和占用的存储空间。
4.避免过度索引虽然索引可以提高查询性能,但是过度使用索引会降低写操作的性能。
因此,需要谨慎选择索引,并考虑索引对写操作的影响。
不需要频繁更新或插入的列可以不创建索引,以减少索引的维护和空间开销。
5.及时更新和重新组织索引随着数据的增长和修改,索引的结构和数据会变得不连续。
这可能导致查询效率下降。
因此,定期检查和更新索引是保持数据库性能的重要步骤之一。
可以通过数据库提供的优化工具或脚本来重新组织索引,以减少索引碎片和提高查询效率。
6.注意索引与数据的一致性当数据库中的数据发生改变时,索引也需要相应的更新。
如果不及时更新索引,可能会导致查询结果不一致或索引失效。
因此,在进行数据的插入、更新和删除操作时,确保及时更新相关的索引,保持数据的一致性和正确性。
数据库索引的使用教程
数据库索引的使用教程数据库索引是提高查询效率的重要工具,它能够加快对数据库中数据的检索速度。
本篇文章将详细介绍数据库索引的使用教程,包括索引的作用、创建索引的注意事项、索引的类型以及优化索引的方法等内容。
一、索引的作用索引是数据库中对某一列或者多个列进行排序的数据结构,能够快速地定位数据并加快数据的检索速度。
它类似于一本书的目录,可以根据索引找到相应的内容,而无需从头开始阅读整本书。
索引可以大大减少数据库的查询时间,提高系统的响应速度和性能。
二、创建索引的注意事项1.选择合适的列进行索引,通常是那些经常用于查询的列或者经常作为查询条件的列。
避免对更新频繁的列进行索引,因为索引的更新可能会导致性能下降。
2.对大型表进行索引时,建议使用分区索引,将数据分成较小的块进行存储,以减少查询时的扫描范围,从而提高查询效率。
3.避免创建过多的索引,索引的数量过多会增加数据库的存储空间和维护成本,并且在写操作时会减慢数据库的速度。
三、索引的类型常见的数据库索引类型包括主键索引、唯一索引、聚簇索引、非聚簇索引和全文索引等。
以下分别介绍各种索引的特点和适用场景:1.主键索引主键索引是用来保证表中每一行的唯一性,并且可以提升对主键列的查询性能。
主键索引在创建表时通过指定主键列来创建,主要用于快速查找和对表进行连接操作。
2.唯一索引唯一索引用于保证指定列的唯一性,可以对表中的多个列建立唯一索引。
当对唯一索引列进行查找时,数据库引擎会自动使用索引进行匹配加速。
3.聚簇索引聚簇索引是按照索引的顺序来组织表记录的物理存储方式,即按照索引的列值进行排序。
聚簇索引在表中只能存在一个,并且通常是主键索引。
它可以提高特定列的查询性能,但会增加对数据的插入、删除和更新操作的成本。
4.非聚簇索引非聚簇索引将索引和表的数据分开存储,即索引和表是分离的。
非聚簇索引可以提高对非索引列的查询性能,但对于索引列的查询速度可能较慢。
5.全文索引全文索引是对文本内容进行索引,常用于搜索引擎等需要进行文本检索的场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle 索引的使用规则与性能调优索引分类逻辑上:Unique 唯一索引物理上:B-tree:Normal 正常型B树Bitmap 位图索引索引结构:B-tree:适合与大量的增、删、改(OLTP);不能用包含OR操作符的查询;适合高基数的列(唯一值多)典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;Bitmap:适合与决策支持系统;做UPDATE代价非常高;非常适合OR 操作符的查询;基数比较少的时候才能建位图索引;树型结构:索引头开始ROWID,结束ROWID(先列出索引的最大范围)BITMAP每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID有值;B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的5%,当然这只是个相对的比率,适用于一般的情况。
bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。
索引就好象一本字典的目录。
凭借字典的目录,我们可以非常迅速的找到我们所需要的条目。
数据库也是如此。
凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表。
虽然说,在表中是否创建索引,不会影响到Oracle数据库的使用,也不会影响数据库语句的使用。
这就好像即使字典没有目录的话,用户仍然可以使用它一样。
可是,若字典没有目录,那么可想而知,用户要查某个条目的话,其不得不翻遍整本字典。
数据库也是如此。
若没有建立相关索引的话,则数据库在查询记录的时候,不得不去查询整个表。
当表中的记录比较多的时候,其查询效率就会很低。
所以,合适的索引,是提高数据库运行效率的一个很好的工具。
不过,并不是说表上的索引越多越好。
过之而不及。
故在数据库设计过程中,还是需要为表选择一些合适的索引。
宁缺勿滥,这是建立索引时的一个遵循标准。
在理论上,虽然一个表可以设置无限的索引。
但是,数据库管理员需要知道,表中的索引越多,维护索引所需要的开销也就越大。
每当数据表中记录有增加、删除、更新变化的时候,数据库系统都需要对所有索引进行更新。
故数据库表中的索引绝对不是多多益善。
具体来说,在索引建立上,笔者对大家有如下建议。
建议一:在基数小的字段上要善于使用位图索引。
基数是位图索引中的一个基本的定义,它是指数据库表中某个字段内容中不重复的数值。
如在员工信息表中的性别字段,一般就只有男跟女两个值,所以,其基数为2;婚姻状况字段的话,则其只有已婚、未婚、离婚三种状态,其基数就为3;民族一览内也是只有有限的几个值。
对于要查询基数小的字段,如现在用户想查找所有婚姻状况为“已婚”的“女性”时,利用位图索引可以提高查询的效率。
这主要是因为标准索引是通过在索引中保存排序过的索引列以及对应的ROWID来实现的。
若我们在基数小的列上建立标准索引的话,则其会返回大量的记录。
而当我们在创建位图索引的时候,在Oracle会对整个表进行扫描,并且会为索引列的每个取值建立一个位图。
若内容相同,则在位图上会以一个相同的数字表示。
此时,若这个字段的基数比较小的话,则若需要实现对整个字段的查询的话,效率就会非常的高。
因为此时,数据库只要位图中数字相同的内容找出来即可。
除了在数据表某列基数比较小的情况下,采用位图索引外,我们往往在一些特殊的情况下,也会建议采用位图索引。
最常见的情况是,在Where限制条件中,若我们多次采用AND或者OR条件时,也建议采用位图索引。
因为当一个查询饮用了一些部署了位图索引的列的时候,这些位图可以很方便的与AND或者Or 运算符操作结合以快速的找出用户所需要的记录。
但是,这里要注意,不是在条件语句中包含运算符的时候,采用位图索引都能够提供比较高的效率。
一般来说,只有AND 或者OR运算符的时候,位图索引才会比较具有优势。
若此时用户采用大于号或者不等于号作为条件语句中的限制条件的时候,则往往采用标准索引具有更大的优势。
所以,笔者在数据库设置中,一般只有在三种情况下才采用位图索引。
一是列的基数比较小,而有可能需要根据这些字段的内容查找相关的记录;二是在条件语句中,用到了AND或者OR运算符的时候。
除了这两种情况外,最好能够采用其他适合的索引。
第三种情况是,需要用到NULL作为查询的限制条件。
因为标准查询一般情况下,会忽略所有的NULL值列。
也就是说,若需要查询“所有没有身份证号码”的员工的信息的时候,标准索引并不能够起到加速查询速度的作用。
此时,就需要采用位图索引。
因为位图索引会记录相关的NULL值列信息。
建议二:创建索引的一些限制条件。
并不说,表或者列建立的索引越多越好。
相反,索引建的越多,有时会反而会影响数据库运行的整体性能。
所以,在建立索引的时候,仍然会有一些限制条件。
一是不要对一些记录内容比较少的表建立索引。
在一个应用系统设计的时候,如设计一个ERP系统的数据库,其虽然有几千张表。
但是,并不是每张表都有大量记录的。
相反,其中有近一半左右的数据表,可能其存储的数据不会超过百条。
如员工登陆帐户密码表、企业部门信息表等等。
对于这些记录内容比较少的表,我们建立最好不要为其建立索引。
无论是表上的,还是字段上,都不要建立索引。
二是若表中的内容比较大,但是,这个表基本上不怎么查询的时候,则只需要在表上建立索引即可;而不需要在字段上建立索引。
如现在在ERP系统中,有一张表是“AD_Table”。
其存储的是这个数据库中相关表的信息。
这张表只有在数据库设计的时候才会用到。
故这张表中的记录虽然比较多,但是由于用户用的比较少,所以,一般没有必要为这张表建立列级别上的索引。
而直接用表索引来代替。
三是在一些NULL字段上,要根据实际情况来判断是否要建立索引。
如现在有一张人事档案的表格,其上面有两个字段,分别为“身份证号码”与“地区”。
有时会为了某个原因,企业需要所有员工都在系统中登记他们的身份证号码,以方便他们办工资卡、社会保险等等。
所以人事管理可能需要经常的查询系统,看看有没有没有身份证号码的员工信息。
此时,就需要利用条件“IS NULL”来查询我们所需要的记录。
故为了提高查询效率,若某个记录可能为空,并且经常需要以NULL为条件进行查询的时候,则最好给这个字段添加一个索引,并且最好建立位图索引。
相反,若虽然可能会以NULL这个条件作为查询的限制语句,但是,用的不是很多的时候,则就没有必要为其建立索引。
建议三:多表连接查询的索引设计。
如现在有一个人事管理系统。
人事经理想知道员工的社保缴纳情况。
他需要知道员工的姓名、职务、户籍性质(农民户口跟居民户口费用不一样)、缴纳的情况等等。
但是,这些信息包含在不同的表中。
因为为了提高数据库的性能,在表中存储的可能只是某些序号,而不是具体的内容。
如在社保表中,存储的是员工对应的编号,而不是员工的名字。
所以,要得到这份报表的话,就可能需要关联员工基本信息表、公司组织结构表等表格,才能够查询到用户所需要的内容。
为此,就需要利用Join语句,把这些表格关联起来。
为了提高数据库的查询效率,这些用来关联的字段,最好能够建立索引。
这可以显著的提高查询的速度。
建议四:在表的更新速度与查询速度之间寻求一个平衡点。
众所周知,索引本身并不影响数据库的使用,其主要是为了提高数据库的查询效率。
但是,由于当数据库的表中的数据更新的时候,包括记录的增加、删除、更改等等,都会对虽有的索引进行更新。
很明显,索引虽然可以提高查询速度。
但是,也会对一些表的更新操作产生不良的影响。
当在表中建立的索引越多,这个不利影响也会越大。
故数据库管理员在设置索引的时候,还需要注意,在这两个之间需要一个均衡点。
按照一般的理论来说,当某个表多数用来查询、更新相对来说比较上的话,则要多多采用索引。
相反,当某个表记录更新居主导,查询相对来说比较少的话,则不要建立太多的索引,避免对更新的速度差生不利影响。
在实际工作中,若某个表频繁的被视图所调用的话,则最好就好设置比较多的索引了。
Oracle索引使用规则首先,我们要确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。
可在svrmgrl或者pl\sql命令模式中运行“show parameter optimizer_mode"来查看。
ORACLE V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。
如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。
查找原因的步骤首先,我们要确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。
可在svrmgrl中运行“show parameter optimizer_mode"来查看。
ORACLE V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。
如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。
其次,检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中,这是“执行计划”能用到相关索引的必要条件。
第三,看采用了哪种类型的连接方式。
ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。
在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。
SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。
HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。
第四,看连接顺序是否允许使用相关索引。
假设表emp的deptno列上有索引,表dept 的列deptno上无索引,WHERE语句有emp.deptno=dept.deptno条件。
在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno 上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。
第五,是否用到系统数据字典表或视图。
由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。
但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。
第六,索引列是否函数的参数。
如是,索引在查询时用不上。
第七,是否存在潜在的数据类型转换。
如将字符型数据与数值型数据比较,ORACLE 会自动将字符型用to_number()函数进行转换,从而导致第六种现象的发生。
第八,是否为表和相关的索引搜集足够的统计数据。