`
jayghost
  • 浏览: 441651 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

索引 建立 常用规则

 
阅读更多

转:http://1226468205.iteye.com/blog/1961370

一.索引介绍

 1.1 索引的创建语法 

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>

      ON <schema>.<table_name>

           (<column_name> | <expression> ASC | DESC,
            <column_name> | <expression> ASC | DESC,...)
     TABLESPACE <tablespace_name>
     STORAGE <storage_settings>
     LOGGING | NOLOGGING
    COMPUTE STATISTICS
     NOCOMPRESS | COMPRESS<nn>
     NOSORT | REVERSE
     PARTITION | GLOBAL PARTITION<partition_setting>

 

相关说明

1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression时即基于函数的索引
3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
4)STORAGE:可进一步设置表空间的存储参数
5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)
6)COMPUTE STATISTICS:创建新索引时收集统计信息
7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

 

 

1.2 索引特点: 

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

 

 

1.3 索引不足:

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

 

 

1.4 应该建索引列的特点:

1)在经常需要搜索的列上,可以加快搜索的速度; 

2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 

3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 

4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 

5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 

6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 

 

 

1.5 不应该建索引列的特点:

第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 

第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 

第三,对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 

第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。 

 

 

1.6 限制索引
限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:
   1.6.1  使用不等于操作符(<>!=      
   下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。     
   select cust_Id,cust_name from customers where  cust_rating <> 'aa';        
把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。        
  select cust_Id,cust_name from customers where cust_rating < 'aa' or cust_rating > 'aa';
  特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
   1.6.使用IS NULL IS NOT NULL
   使用IS NULL IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成 NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。
   1.6.3 使用函数
   如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。 下面的查询不会使用索引(只要它不是基于函数的索引)
 select empno,ename,deptno from emp  where  trunc(hiredate)='01-MAY-81';
   把上面的语句改成下面的语句,这样就可以通过索引进行查找。
select empno,ename,deptno from emp where  hiredate<(to_date('01-MAY-81')+0.9999);

  1.6.4 比较不匹配的数据类型       
也是比较难于发现的性能问题之一。 注意下面查询的例子,account_number是一个VARCHAR2类型,account_number字段上有索引。

下面的语句将执行全表扫描

 select bank_name,address,city,state,zip from banks where account_number = 990354;
  Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:
 select bank_name,address,city,state,zip from banks where account_number ='990354';

特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次全表扫描

 

***********************************************

(转自http://topic.csdn.net/u/20100112/22/fcf75541-09bd-4373-8d81-2ca833e0195f.html )

建立索引常用的规则如下:  
1、表的主键、外键必须有索引;

2、数据量超过300的表应该有索引;

3、经常与其他表进行连接的表,在连接字段上应该建立索引;

4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

5、索引应该建在选择性高的字段上;

6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

  A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

  B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

  D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

  E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

8、频繁进行数据操作的表,不要建立太多的索引;

9、删除无用的索引,避免对执行计划造成负面影响;

  以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

 

分享到:
评论

相关推荐

    Oracle 创建索引的基本规则

    ### Oracle 创建索引的基本规则 在Oracle数据库管理中,创建合适的索引对于提高查询效率、减少数据处理时间具有重要作用。本文将围绕Oracle创建索引的基本规则进行深入探讨,旨在帮助读者更好地理解如何根据不同的...

    mysql优化sql语句的优化(索引,常用小技巧.)

    - **主键索引**:为表的主键列创建的索引。 - **唯一索引**:用于确保列中的数据具有唯一性。 - **普通索引**:最常见的索引类型,用于加速查询。 - **全文索引**:用于全文搜索,适用于文章内容的搜索场景。 -...

    MS Sql 2005 全文索引

    全文索引主要针对的是文本型数据,能够根据特定语言的规则对词汇进行索引,从而实现基于关键字的快速查询。 #### 14.2 全文索引中常用的术语 为了更好地理解全文索引的工作原理和技术细节,下面将详细介绍全文索引...

    基于索引的SQL优化之降龙十八掌(一)

    降龙十八掌内功的入门基础,建立索引常用的规则如下: 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段...

    SQLServer索引碎片和解决方法

    当向该索引中插入数字5时,为了维持索引的排序规则,DBMS会创建一个新的索引页来存放原本位于位置5的数字6和8,并将5插入到原位置。此时,索引的顺序变为1、2、3、4、5、6、8,但索引页的实际物理位置已经不再连续,...

    Mysql索引数据结构.pptx

    同时,过度使用索引也可能带来负面影响,如写操作性能下降、额外的存储空间消耗,因此合理创建和维护索引至关重要。 总的来说,理解 MySQL 索引的数据结构有助于我们更好地设计数据库,编写高效的 SQL 查询,从而...

    带索引的listview

    数据源(如ArrayList或Cursor)中的数据需要按照一定的规则排序,通常是以索引字段(如首字母)进行排序。 3. **布局设计**: 在ListView的布局文件中,添加一个额外的布局区域来显示索引栏。可以使用TextView...

    快速拼音索引

    然后,建立一个索引结构,如二叉树或哈希表,用于快速定位到特定拼音前缀对应的数据。 4. **查询优化**:在查询时,用户输入拼音关键字,系统通过索引快速找到所有以该拼音开头的记录,返回给用户。为了提高效率,...

    浅析索引在SQL语句中的使用技巧.pdf

    函数索引通过在某一列上利用函数来创建索引。例如:create index idx_name on table_name (function(column_name))。在实际应用中,索引的使用可以根据实际情况选择,例如,某些情况下,B 树索引可能更适合,而在...

    数据库,索引,主键,约束,sql

    数据库管理系统(DBMS)在创建索引后,可以通过索引直接查找数据,而不是扫描整个表。常见的索引类型包括B树索引、位图索引和哈希索引,每种都有其适用场景和性能特点。 主键是表中的一个或一组字段,用于唯一标识...

    (转)sql2005全文索引.doc

    5. **筛选器**: 用于从varbinary(max)或image列中的文件提取特定文本类型的文本,将提取的信息用于建立索引。 6. **填充(爬网)**: 创建和维护全文索引的过程。 7. **干扰词**: 频繁出现但对搜索无意义的词汇,通常...

    关于oracle的表空间,分区表,以及索引的总结

    其中,B树索引是最常用的索引类型,适用于大多数查询场景。 - **索引的创建与优化**:创建索引时,应考虑列的选择性和查询模式。例如,对于频繁出现在WHERE子句中的列,创建索引可以大大提高查询速度。同时,应定期...

    资料sql全文索引.pdf

    全文索引的常用术语: * 全文索引:一种特殊的索引,能够在给定的列中存储有关重要的词及位置的信息,使用这些信息可以快速进行全文查询,搜索包括特定词或词组的行。 * 全文目录:全文目录是存储全文索引的地方,...

    android按字母排序的省份列表类似通讯录的字母索引.rar

    2. **AlphabetIndexer**:这是Android SDK中的一个类,用于创建字母索引。它维护了一个字符到列表中对应位置的映射,以便快速定位到特定字母下的省份。 3. **SectionIndexer**:这是Adapter接口的一个扩展,用于...

    android带索引和标题的listview

    在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。在某些场景下,为了提高用户的浏览效率和体验,我们可能会需要实现一个带有索引和标题的ListView。这样的ListView不仅能够展示基本的数据项,...

    MySQL索引背后的数据结构及算法原理.pdf

    根据查询特点,考虑建立合适的索引,如考虑建立基于主键、特定查询条件或者排序规则的索引,来优化查询性能。 ### 总结 本文通过介绍MySQL索引背后的数据结构和算法原理,深入分析了B-Tree和B+Tree的特点及对MySQL...

    tableView右侧索引

    在iOS开发中,UITableView是一种常用的UI控件,用于展示列表数据。右侧索引,也称为section index或section index title,通常出现在表格视图的右边,为用户提供了快速跳转到不同字母或数字区域的便捷方式。这个...

    浅谈Oracle数据库基于索引的SQL语句优化方法.pdf

    建立索引时,通常需要遵循一些规则,例如: - 表的主键(Primary Key)和外键(Foreign Key)字段必须有索引,因为这些字段通常用于连接操作和唯一性约束。 - 经常用于与其他表进行连接操作的字段也应当建立索引。 -...

    MySQL SQL高级特性 字段约束-索引-视图-外键学习实践

    其中,字段约束、索引、视图和外键是常用的几个重要概念。本文档将围绕MySQL中这些高级特性的学习实践进行详细探讨。 首先,字段约束是数据库中对字段应该满足的规则的一种描述。它用于保证数据库中数据的完整性和...

Global site tag (gtag.js) - Google Analytics