Oracle数据库创建索引的几个原则
创建索引原则

Oracle提供了大量索引选项。
知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。
一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。
而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。
这篇文章就将简单的讨论每个索引选项。
主要有以下内容:[1] 基本的索引概念查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES 的方法来检索模式(schema)的索引。
访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
[2] 组合索引当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。
在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。
比如:表emp有一个组合索引键,该索引包含了empno、ename和deptno。
在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引![3] ORACLE ROWID通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。
ROWID其实就是直接指向单独行的线路图。
如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。
[4] 限制索引限制索引是一些没有经验的开发人员经常犯的错误之一。
在SQL中有很多陷阱会使一些索引无法使用。
下面讨论一些常见的问题:4.1 使用不等于操作符(<>、!=)下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
select cust_Id,cust_namefrom customerswhere cust_rating <> 'aa';把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。
oracle索引总结

oracle 索引总结oracle 索引总结简介1.说明 1)索引是数据库对象之⼀,⽤于加快数据的检索,类似于书籍的索引。
在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利⽤索引可以不⽤翻阅整本书即可找到想要的信息。
2)索引是建⽴在表上的可选对象;索引的关键在于通过⼀组排序后的索引键来取代默认的全表扫描检索⽅式,从⽽提⾼检索效率 3)索引在逻辑上和物理上都与相关的表和数据⽆关,当创建或者删除⼀个索引时,不会影响基本的表; 4)索引⼀旦建⽴,在表上进⾏DML 操作时(例如在执⾏插⼊、修改或者删除相关操作时),oracle 会⾃动管理索引,索引删除,不会对表产⽣影响 5)索引对⽤户是透明的,⽆论表上是否有索引,sql 语句的⽤法不变 6)oracle 创建主键时会⾃动在该列上创建索引索引原理1. 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有⼀个wish ,必须全部搜索⼀遍2. 若在name 上建⽴索引,oracle 会对全表进⾏⼀次搜索,将每条记录的name 值哪找升序排列,然后构建索引条⽬(name 和rowid ),存储到索引段中,查询name 为wish 时即可直接查找对应地⽅3.创建了索引并不⼀定就会使⽤,oracle ⾃动统计表的信息后,决定是否使⽤索引,表中数据很少时使⽤全表扫描速度已经很快,没有必要使⽤索引索引使⽤(创建、修改、删除、查看)1.创建索引语法CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique 表⽰唯⼀索引ON table_name([column1 [ASC|DESC],column2 --bitmap ,创建位图索引[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1] --指定索引在数据块中空闲空间[STORAGE (INITIAL n2)][NOLOGGING] --表⽰创建和重建索引时允许对表做DML 操作,默认情况下不应该使⽤[NOLINE][NOSORT]; --表⽰创建索引时不进⾏排序,默认不适⽤,如果数据已经是按照该索引顺序排列的可以使⽤2.修改索引1)重命名索引alter index index_sno rename to bitmap_index;2) 合并索引(表使⽤⼀段时间后在索引中会产⽣碎⽚,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引⽅式更好些,⽆需额外存储空间,代价较低)alter index index_sno coalesce ;3)重建索引 ⽅式⼀:删除原来的索引,重新建⽴索引 ⽅式⼆:alter index index_sno rebuild;3.删除索引drop index index_sno;4.查看索引select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';-- eg:create index index_sno on student('name');select*from all_indexes where table_name='student';索引分类1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值)1)说明: 1.oracle中最常⽤的索引;B树索引就是⼀颗⼆叉树;叶⼦节点(双向链表)包含索引列和指向表中每个匹配⾏的ROWID值 2.所有叶⼦节点具有相同的深度,因⽽不管查询条件怎样,查询速度基本相同 3.能够适应精确查询、模糊查询和⽐较查询2)分类: UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)3)创建例⼦craete index index_sno on student('sno');4)适合使⽤场景: 列基数(列不重复值的个数)⼤时适合使⽤B数索引2. 位图索引1)说明: 1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建⽴⼀个位图(位图中,对表中每⼀⾏使⽤⼀位(bit,0或者1)来标识该⾏是否包含该位图的索引列的取值,如果为1,表⽰对应的rowid所在的记录包含该位图索引列值),最后通过位图索引中的映射函数完成位到⾏的ROWID的转换2)创建例⼦create bitmap index index_sno on student(sno);3) 适合场景:对于基数⼩的列适合简历位图索引(例如性别等)3.单列索引和复合索引(基于多个列创建)1) 注意: 即如果索引建⽴在多个列上,只有它的第⼀个列被where⼦句引⽤时,优化器才会使⽤该索引,即⾄少要包含组合索引的第⼀列4. 函数索引1)说明: 1. 当经常要访问⼀些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度 2. 函数索引既可以使⽤B数索引,也可以使⽤位图索引;当函数结果不确定时采⽤B树索引,结果是固定的某⼏个值时使⽤位图索引 3. 函数索引中可以⽔泥⽤len、trim、substr、upper(每⾏返回独⽴结果),不能使⽤如sum、max、min、avg等2)例⼦:create index fbi on student (upper(name));select*from student where upper(name) ='WISH';索引建⽴原则总结 1. 如果有两个或者以上的索引,其中有⼀个唯⼀性索引,⽽其他是⾮唯⼀,这种情况下oracle将使⽤唯⼀性索引⽽完全忽略⾮唯⼀性索引 2. ⾄少要包含组合索引的第⼀列(即如果索引建⽴在多个列上,只有它的第⼀个列被where⼦句引⽤时,优化器才会使⽤该索引) 3. ⼩表不要简历索引 4. 对于基数⼤的列适合建⽴B树索引,对于基数⼩的列适合简历位图索引 5. 列中有很多空值,但经常查询该列上⾮空记录时应该建⽴索引 6. 经常进⾏连接查询的列应该创建索引 7. 使⽤create index时要将最常查询的列放在最前⾯ 8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长⼆进制数据,最长2G)列不能创建索引 9.限制表中索引的数量(创建索引耗费时间,并且随数据量的增⼤⽽增⼤;索引会占⽤物理空间;当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)注意事项1. 通配符在搜索词⾸出现时,oracle不能使⽤索引,eg:--我们在name上创建索引;create index index_name on student('name');--下⾯的⽅式oracle不适⽤name索引select*from student where name like'%wish%';--如果通配符出现在字符串的其他位置时,优化器能够利⽤索引;如下:select*from student where name like'wish%';2. 不要在索引列上使⽤not,可以采⽤其他⽅式代替如下:(oracle碰到not会停⽌使⽤索引,⽽采⽤全表扫描)select*from student where not (score=100);select*from student where score <>100;--替换为select*from student where score>100or score <1003. 索引上使⽤空值⽐较将停⽌使⽤索引, eg:select*from student where score is not null;。
oracle常用索引分析,使用原则和注意事项

oracle常⽤索引分析,使⽤原则和注意事项本⽂参考:索引简介• 索引(index)是数据库对象的⼀种。
索引的关键在于通过⼀组排序后的物理地址作为键来取代默认的全表扫描检索⽅式,就像为书本添加⽬录,通过牺牲物理内存的⽅式提⾼数据的检索效率。
• 它对⽤户时透明的,它的创建不会影响对表的sql操作。
索引⼀旦建⽴,在表上进⾏DML操作时(例如在执⾏插⼊、修改或者删除相关操作时),oracle会⾃动管理索引。
• oracle创建主键时会⾃动创建索引添加索引1.创建默认索引CREATE UNIQUE INDEX (索引名称) ON 表名 (列名1,列名2...) ; --unique(默认)表⽰唯⼀索引2.修改索引alter index (旧索引名称) rename to(新索引名称);3.删除索引drop index (索引名称);4.查看索引查看某表的所有索引:select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name =(表名);常⽤的2种索引及适⽤场景1.b树索引(默认索引,保存排序过的索引列和对应的rowid值)b树索引是oracle最常见的的索引,它的原理是利⽤了b-树的数据结构(b树的原理:)b树索引结构图:b树的所有叶⼦节点拥有相同的深度,oracle将索引列和对应的rowid值存⼊叶⼦节点上,因此所有的检索速度基本都是相同的。
b树索引的不适⽤场景:不适合键值较少的列(重复数据较多的列)假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。
再加上访问索引块,⼀共要访问⼤于200个的数据块。
如果全表扫描,假设10条数据⼀个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块少⼀点,肯定不会利⽤b树索引了。
Oracle 创建索引

Oracle创建索引Oracle在创建索引时要遵循以下的原则:●平衡查询和DML的需要。
在易挥发(DML操作频繁)的表上尽量减少索引的数量,因为索引虽然加快了查询的速度,但却降低了DML操作速度。
●将其放入单独的表空间,不要与表、临时段或还原(回滚)段放在一个表空间,因为索引段会与这些段竞争输入/输出(I/O)。
●使用统一的EXTENT尺寸:数据块尺寸的5倍,或表空间的MINIMUM EXTENT的尺寸。
这样做的目的是为了减少系统的转换时间。
●对大索引可以考虑使用NOLOGGING。
这样做的目的是通过减少REDO操作来提高系统的效率,但是如果一旦系统发生崩溃,则该索引一般是无法进行完全灰度的。
不过问题也不是很大,因为真正的数据还在表中,所以可以通过重建该索引来恢复与之前完全相同的效果。
●索引的INITRANS参数通常应该比相对应表的高。
以为索引项要比表中的数据行小的多,所以一个数据块可以存放更多的索引项(记录)。
创建索引的命令格式:CREATE (UNIQUE|BITMAP) INDEX [用户名.]索引名ON [用户名.]表名(列名[ASC | DESC] [,列名[ASC| DESC ] ]…)[TABLESPACE 表空间名][PCTFREE 正整型数][INITRANS 正整型数][MAXTRANS 正整型数][存储子句][LOGGING | NOLOGGING][NOSORT]其中,●UNIQUE:说明该索引是唯一索引,默认是非唯一的●ASC:说明所创建的索引为升序●DESC:说明所创建的索引为降序●表空间名:说明将要创建的索引的表空间名●PCTFREE:在创建索引时每一个块中预留的空间●INITRANS:在每一个块中预分配的事物记录数,默认值为2●MAXTRANS:在每一个块中可以分配的事物记录数的上限,默认为255●存储子句:说明在索引中EXTENTS怎样分配●LOGGING:说明在创建索引是和以后的索引操作中要记录联机重做日志文件(默认)●NOLOGGING:说明索引的创建和一些数据装入操作将不记录联机重做日志文件●NOSORT:数据库中所存的数据行已经按升序排好,因此在创建索引时不需要再排序了●PCTUSED:在索引中不能说明该参数。
Oracle视图中建立索引的注意事项

Oracle视图中建立索引的注意事项在视图上创建索引需要三个条件:一、视图必须绑定到架构。
要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击右键,属性,选中“绑定到架构”。
二、索引必须是唯一索引。
要做到这点,在 CREATE INDEX 中必须指定 UNIQUE。
三、索引必须是聚集索引。
要做到这点,在 CREATE INDEX 中必须指定 CLUSTERED。
例:CREATE VIEW viewFoo WITH SCHEMABINDINGASSELECT id...CREATE UNIQUE CLUSTERED INDEX index_viewFoo ON viewFoo(id)在视图上创建聚集索引之前,该视图必须满足下列要求:当执行 CREATE VIEW 语句时,ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON。
OBJECTPROPERTY 函数通过 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 属性为视图报告此信息。
为执行所有 CREATE TABLE 语句以创建视图引用的表,ANSI_NULLS 选项必须设置为 ON。
视图不能引用任何其它视图,只能引用基表。
视图引用的所有基表必须与视图位于同一个数据库中,并且所有者也与视图相同。
必须使用 SCHEMABINDING 选项创建视图。
SCHEMABINDING 将视图绑定到基础基表的架构。
必须已使用 SCHEMABINDING 选项创建了视图中引用的用户定义的函数。
表和用户定义的函数必须由 2 部分的名称引用。
不允许使用 1 部分、3 部分和 4 部分的名称。
视图中的表达式所引用的所有函数必须是确定性的。
OBJECTPROPERTY 函数的 IsDeterministic 属性报告用户定义的函数是否是确定性的。
Oracle索引

Oracle索引
在正确使用索引的前提下,索引可以提高检索相应的表的速度。
当用户考虑在表中使用索引时,应遵循下列一些基本原则。
(1)在表中插入数据后创建索引。
在表中插入数据后,创建索引效率将更高。
如果在装载数据之前创建索引,那么插入每行时oracle都必须更改索引。
(2)索引正确的表和列。
如果经常检索包含大量数据的表中小于15%的行,就需要创建索引。
为了改善多个表的相互关系,常常使用索引列进行关系连接。
(3)主键和唯一关键字所在的列自动具有索引,但应该在与之关联的表中的外部关键字所在的列上创建索引。
(4)合理安排索引列。
在createindex语句中,列的排序会影响查询的性能,通常将最常用的列放在前面。
创建一个索引来提高多列的查询效率时,应该清楚地了解这个多列的索引对什么列的存取有效,对什么列的存取无效。
例如:在A,B,C三列上创建索引A有效AB有效ABC有效(5)限制表中索引的数量。
尽管表可以有任意数量的索引,可是索引越多,在修改表中的数据时对索引做出相应更改的工作量也越大,效率也就越低。
同样,目前不用的索引应该及时删除。
(6)指定索引数据块空间的使用。
创建索引时,索引的数据块是用表中现存的值填充的,直到达到PCTFREE为止。
如果打算将许多行插入到被索引的表中,PCTFREE就应设置得大一点,不能给索引指定PCTUSED。
(7)根据索引大小设置存储参数。
创建索引之前应先估计索引的大小,以便更好地促进规划和管理磁盘空间。
单个索引项的最大值大约是数据块大小的一半。
oracle创建索引

oracle创建索引数据库索引是为了提⾼查询速度的⼀种数据结构。
索引的创建语句索引的创建语句⾮常简单。
CREATE INDEX 索引名 ON 表名(列名);除了单列索引,还可以创建包含多个列的复合索引。
CREATE INDEX 索引名 ON 表名(列名1, 列名2, 列名3, ...);删除索引也⾮常简单。
DROP INDEX 索引名;查看某个表中的所有索引也同样简单。
SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名'还可以查看某个表中建⽴了索引的所有列。
SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = '表名'索引的建⽴原则1.索引应该建⽴在WHERE⼦句中经常使⽤的列上。
如果某个⼤表经常使⽤某个字段进⾏查询,并且检索的啊⾏数⼩于总表⾏数的5%,则应该考虑在该列上建⽴索引。
2.对于两个表连接的字段,应该建⽴索引。
3.如果经常在某表的⼀个字段上进⾏Order By的话,则也应该在这个列上建⽴索引。
4.不应该在⼩表上建⽴索引。
索引的优缺点索引主要是为了提⾼数据的查询速度,这就是索引的优点。
但是当进⾏增删改的时候,会更新索引。
因此索引越多,增删改的速度就会越慢,因为有⼀个维护索引的过程。
创建索引之前需要权衡该字段是否经常发⽣增删改操作,否则可能会带来负优化的问题。
索引的优点1.很⼤地提⾼了数据的检索速度。
2.创建唯⼀索引能保证数据库表中每⼀⾏数据的唯⼀性(唯⼀性约束)。
3.提⾼表与表之间的连接速度。
索引的缺点1.索引需要占⽤物理空间。
2.当对表中的数据进⾏增加、删除和修改的时候,索引也要动态地进⾏维护,降低数据的维护速度。
关于查询优化器当Oracle拿到SQL语句的时候,会使⽤查询优化器去分析该语句,并根据分析结果⽣成查询执⾏计划。
也就是说,数据库是执⾏的查询计划,⽽不是SQL语句。
创建Oracle数据库索引的三个标准

在Oracle数据库中,创建索引虽然比较简单。
但是要合理的创建索引则比较困难了。
笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。
虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力。
具体的来说,要做到这个三个适当有如下几个要求。
一、根据表的大小来创建索引。
虽然给表创建索引,可以提高查询的效率。
但是数据库管理员需要注意的是,索引也需要一定的开销的。
为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。
这个认识是错误的。
恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。
因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。
所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。
一般来说,不需要为比较小的表创建索引。
如在一个ERP系统的数据库中,department表用来存储企业部门的信息。
一般企业的部分也就十几个,最多不会超过一百个。
这100条记录对于人来说,可能算是比较多了。
但是对于计算机来说,这给他塞塞牙缝都还不够。
所以,对类似的小表没有必要建立索引。
因为即使建立了索引,其性能也不会得到很大的改善。
相反索引建立的开销,如维护成本等等,要比这个要大。
也就是说,付出的要比得到的多,显然违反常理。
另外,就是对于超大的表,也不一定要建立索引。
有些表虽然比较大,记录数量非常的多。
但是此时为这个表建立索引并一定的合适。
如系统中有一张表,其主要用来保存数据库中的一些变更信息。
往往这些信息只给数据库管理员使用。
此时为这张表建立索引的话,反而不合适。
因为这张表很少用到,只有在出问题的时候才需要查看。
其次其即使查看,需要查询的纪录也不会很多,可能就是最近一周的更新记录等等。
对于对于一些超大的表,建立索引有时候往往不能够达到预计的效果。
而且在打表上建立索引,其索引的开销要比普通的表大的多。
oracle 索引原则

oracle 索引原则
Oracle索引的原则包括以下几点:
1. 唯一性原则:索引的值必须是唯一的,确保在索引字段上不存在重复值。
这可以通过在创建索引时添加UNIQUE约束来实现。
2. 精确性原则:索引应该被正确地定义和使用,以确保在查询时只返回需要的结果,并且能够准确地匹配查询条件。
使用合适的数据类型和大小限制可以提高索引的精确性。
3. 冗余性原则:索引应该避免对重复或冗余数据进行索引。
对于经常被查询的字段,可以考虑创建索引,而对于很少被查询的字段,则可以避免创建索引,以提高性能。
4. 支持性原则:索引应该能够支持常见的查询模式和条件,以提高查询性能。
合理选择索引字段和顺序,可以使索引更好地支持常用的查询操作。
5. 可管理性原则:索引应该易于管理,包括创建、修改和删除索引。
不需要的索引应该及时删除,以减少数据库的维护工作和存储空间占用。
6. 统计信息原则:索引应该基于准确和实时的统计信息进行优化。
Oracle提供了收集统计信息的机制,可以通过收集和更新统计信息来帮助数据库优化器选择最佳的查询计划。
综上所述,索引的原则是确保唯一性、精确性、避免冗余、支持常用查询模式、易于管理和基于准确统计信息进行优化。
这些原则有助于提高数据库的性能和可用性。
oracle 索引的添加规则

oracle 索引的添加规则Oracle 索引是数据库中一种重要的数据结构,它能够使查询操作的速度得到显著的提升。
一个好的索引可以提高 SQL 查询的效率,加快数据库查询速度,但不当使用也会影响数据库性能。
以下是在 Oracle 数据库中添加索引的步骤:第一步:确定需要的列确定需要加索引的列,在查询中用到的列是需要加索引的。
在可以增加索引的列,首先应该考虑唯一值的列是否适合加索引。
第二步:创建索引在确定需要加索引的列以后,我们就需要创建索引。
常用的有 B 树索引和位图索引,其中 B 树索引就是在非数字列上建立排序树,使检索更快,位图索引则应用与高基数(distinct value)的列,如性别或邮政编码等。
创建索引语法如下:create index 索引名 on 表名(列名);第三步:判断索引的类型Oracle 中的索引类型非常多,如 B 树索引、位图索引、函数索引、簇索引等等。
在具体选择索引类型时,需要根据具体的场景进行选择。
比如说 B 树索引适用于经常用到相等比较而不是范围比较; 位图索引适用于取值范围比较小的情况下,索引复杂度低,查询效率很高。
第四步:考虑索引的创建时间对于查询次数较少的表,其创建时间基本上不会影响表的性能。
但是对于查询次数较多的表,建立索引的时间就会影响表的性能,因为在建立索引的过程中会锁定表,这个时间段里面所有涉及到此表的查询都会受到影响。
第五步:考虑索引的数量虽然索引可以加快查询效率,但是在建立索引的时候,需要考虑索引数量的大小。
如果索引数量过多,会导致插入、删除、更新表时,重建索引太慢,甚至无法索引,无意间会导致表的性能变慢。
所以需要对索引数量进行合理控制。
总之,在 Oracle 数据库中添加索引是一项非常重要的工作,如果合理使用索引可以让查询效率得到提升,加快数据库查询速度。
但是需要注意的是,在添加索引时不要过度,要考虑好各个因素,才能使索引发挥最优性能。
第6章 Oracle索引(创建、简介、技巧)

四、管理索引的原则
使用索引的目的是为了提高系统的效率,但同时它也会 增加系统的负担,进行影响系统的性能,因为系统必须在 进行DML操作后维护索引数据。
在新的SQL标准中并不推荐使用索引,而是建议在创建 表的时候用主键替代。因此,为了防止使用索引后反而降 低系统的性能,应该遵循一些基本的原则。
四、管理索引的原则
限制:
6、不能对LONG类型列加约束条件(NULL、NOT NULL、 DEFAULT除外),如:关键字列(PRIMARY KEY)不能是 LONG 数据类型。
7、LONG类型列不能用在Select的以下子句中:where、 group by、order by,以及带有distinct的select语句中。 8、LONG类型列不能用于分布查询。
– Non-Unique:非唯一索引,其索引值可以重复,允许为 NULL。默认情况下,Oracle创建的索引是非唯一索引。
– Reverse Key:反向关键字索引。通过在创建索引时指定 “REVERSE”关键字,可以创建反向关键字索引,被索引的 每个数据列中的数据都是反向存储的,但仍然保持原来数据 列的次序。
3. 位图索引
当创建位图索引时,Oracle会扫描整张表,并为索引列 的每个取值建立一个位图。在这个位图中,对表中每一行 使用一位(bit,取值为0或1)来表示该行是否包含该位图 的索引列的取值,如果为1,则表示该位对应的ROWID所 在的记录包含该位图索引列值。最后通过位图索引中的映 射函数完成位到行的ROWID的转换。
第6章 Oracle_索引
本章内容
6.1 索引概述 6.2 创建索引 6.3 修改索引 6.4 查看索引
6.1 Oracle索引概述
一、索引的概念
oracle索引及使用原则

oracle索引及使用原则一、索引类型B-tree indexes 平衡二叉树,缺省的索引类型B-tree cluster indexes cluster的索引类型Hash cluster indexes cluster的hash索引类型Global and local indexes 与patitioned table相关的索引Reverse key indexes Oracle Real Application Cluster使用Bitmap indexes 位图索引,索相列的值属于一个很小的范围Function-based indexes 基于函数的索引Domain indexes二、使用索引的原则尽量在插入数据完成后建立索引,因为索引将导致插入数据变慢,特别是唯一索引在正确的表和列上建索引优化索引列顺序提高性能限制每个表的索引个数删除不需要的索引指定索引的block设置估计索引的大小设置存储参数指定索引使用的表空间建索引时使用并行使用nologing建立索引二,各种索引使用场合及建议(1)B*Tree索引。
常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。
Create index indexname on tablename(columnname[columnname...])(2)反向索引。
B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。
Create index indexname on tablename(columnname[columnname...]) reverse(3)降序索引。
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
Create index indexname on tablename(columnname DESC[columnname...])(4)位图索引。
数据库建立索引的原则

数据库建立索引的原则数据库索引是用于提高查询性能的重要工具,可以有效减少查询数据的时间和资源消耗。
在建立数据库索引时,需要遵循一些原则来保证索引的有效性和性能。
1.索引选择唯一性:索引字段应该具有唯一性,这样可以避免重复值的存在,减少索引的大小和查询时间。
通常可以根据数据库表中的主键或者唯一键来选择唯一性索引。
2.索引选择选择性:索引字段的选择性是指索引字段的取值范围的唯一性程度。
选择性越高,索引的效果越好。
选择性是通过计算不同的索引值与总记录数的比值来确定的。
通常情况下,选择性大于20%的字段可以作为索引字段。
3. 索引选择频繁查询字段:根据查询的频率来选择建立索引的字段。
如果一些字段经常被用于查询条件中,那么建立索引可以大大提高查询性能。
例如,对于经常用于where条件的字段,如时间字段、ID字段,可以考虑建立索引。
4.索引选择查询效果好的字段:根据查询的效果来选择建立索引的字段。
应该选择那些查询效果好的字段作为索引。
例如,对于SQL语句中经常用于排序或者分组的字段,建立索引可以提高查询性能。
5.索引选择不可修改的字段:索引字段应当具有稳定性和不可修改性。
当索引字段被频繁修改时,会导致索引维护的开销很大,影响数据库性能。
因此,建议选择稳定不可更改的字段作为索引。
6. 索引选择合适的索引类型:根据数据特点和查询需求来选择适合的索引类型。
常见的索引类型包括B-Tree索引、Hash索引、全文索引等。
不同的索引类型适用于不同的数据类型和查询场景,选择合适的索引类型可以提高查询效率。
7.索引选择适当的索引数量:索引的数量不是越多越好,过多的索引会增加数据维护的开销,降低插入、更新和删除操作的性能。
需要根据查询需求和系统容量来选择适当的索引数量。
8.索引选择适当的索引长度:对于字符串类型的字段,需要选择适当的索引长度。
如果索引长度过短,可能导致索引失效;如果索引长度过长,会增加索引的存储空间和查询时间。
数据库建立索引的原则

数据库建立索引的原则数据库索引是一种提高数据检索速度的技术,通过对数据库表中的其中一列或多列进行索引,可以加快数据库查询的速度。
在建立索引时,需要遵循一些原则,以确保索引的有效性和可靠性。
以下是数据库建立索引的一些原则:1.选择合适的索引列:应该选择具有高选择性的列作为索引列,即该列的取值范围相对较小,区分度较高。
通常情况下,选择主键列或经常被用于查询条件的列作为索引列是较为合适的选择。
2.考虑查询的频率和效率:建立索引的目的是加快查询速度,所以应该优先考虑被频繁查询的列,并且索引应该能够有效减少查询的数据量。
对于那些很少被查询或者查询效率已经非常高的列,可以不进行索引。
3.不过度索引:过多的索引会增加数据库的维护成本和存储空间的占用,同时还会降低更新操作的性能。
因此,在建立索引时应该避免过度索引,只对那些真正需要提高查询性能的列进行索引。
4.考虑查询条件的复合性:如果在查询中使用了多个条件,那么可以考虑建立多列索引。
多列索引可以进行范围查询、排序和分组等操作。
5.不要对较小的表进行索引:对于较小的表,索引的成本可能会超过性能的提升。
因此,在设计较小的表时,可以根据具体使用情况,决定是否需要建立索引。
6.定期维护索引:索引在数据库中起到提高查询性能的作用,但随着数据的增删改,索引也会失效。
因此,需要定期维护索引,包括重建索引、重新统计索引信息、分析索引的使用情况等操作。
7.在查询中使用覆盖索引:如果查询的列都包含在了一些索引中,那么数据库可以直接通过索引返回需要的结果,而不需要再去查询数据表。
这种情况下,查询性能会更高。
8.考虑索引的存储位置:索引可以存储在磁盘上,也可以存储在内存中。
存储在内存中的索引查询速度更快,但内存有限,需要合理配置索引的存储位置。
总之,建立索引是提高数据库查询性能的一种重要手段,但也需要根据具体情况进行综合考虑。
合理选择索引列,避免过度索引,定期维护索引,并考虑查询条件的复合性,都是建立索引的重要原则。
数据库、数据表建立索引的原则

数据库、数据表建⽴索引的原则
数据库建⽴索引的原则
1,确定针对该表的操作是⼤量的查询操作还是⼤量的增删改操作。
2,尝试建⽴索引来帮助特定的查询。
检查⾃⼰的sql语句,为那些频繁在where⼦句中出现的字段建⽴索引。
3,尝试建⽴复合索引来进⼀步提⾼系统性能。
修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间。
4,对于⼩型的表,建⽴索引可能会影响性能
5,应该避免对具有较少值的字段进⾏索引。
6,避免选择⼤型数据类型的列作为索引。
索引建⽴的原则
索引查询是数据库中重要的记录查询⽅法,要不要进⼊索引以及在那些字段上建⽴索引都要和实际数据库系统的查询要求结合来考虑,下⾯给出实际中的⼀些通⽤的原则:
1. 在经常⽤作过滤器的字段上建⽴索引;
2. 在SQL语句中经常进⾏GROUP BY、ORDER BY的字段上建⽴索引;
3. 在不同值较少的字段上不必要建⽴索引,如性别字段;
4. 对于经常存取的列避免建⽴索引;
5. ⽤于联接的列(主健/外健)上建⽴索引;
6. 在经常存取的多个列上建⽴复合索引,但要注意复合索引的建⽴顺序要按照使⽤的频度来确定;
7. 缺省情况下建⽴的是⾮簇集索引,但在以下情况下最好考虑簇集索引,如:含有有限数⽬(不是很少)唯⼀的列;进⾏⼤范围的查询;充分的利⽤索引可以减少表扫描I/0的次数,有效的避免对整表的搜索。
当然合理的索引要建⽴在对各种查询的分析和预测中,也取决于DBA的所设计的数据库结构。
Oracle数据库索引

Oracle数据库索引[什么是索引]其实索引的作⽤就如同图书的⽬录,我们可以根据⽬录中的页码快速的找到所需的内容。
在关系型数据库中,索引是⼀种和表有关的数据结构(⼀般是树结构例如 Oracle数据库使⽤树算法处理索引; Berkerly DB , sqlite , mysql 数据库都使⽤了算法处理索引),它们都可以使查询的sql语句执⾏的更快编写⼀本书,只有章节内容定好之后再设置⽬录;数据库索引也是⼀样,只有先插⼊好数据,再建⽴索引。
[为何索引可提⾼查询效率]因为DB在执⾏⼀条sql语句的时候,默认的⽅式是根据搜索条件进⾏全表扫描,遇到匹配条件就加⼊搜索结果集合。
如果我们对某⼀字段增加索引,查询时就会先去索引列表中⼀次定位到特定值的⾏数,⼤⼤减少遍历匹配的⾏数,所以能明显增加查询的速度。
[索引的类型][索引的类型]1.全表扫描全表扫描(FULL TABLE SCANS) 时所有⾏、所有数据快均会被读到,是效率最低的⼀种,⼀般会在表缺少索引、读取⼤量数据、访问⼩表或⾼并发时发⽣2. ROWID扫描ROWID扫描是通过rowid中数据⽂件和块位置访问数据⾏。
⼀般作为访问索引后的第⼆步,如果访问的列全部包含在索引中,则不会执⾏rowid扫描3. 索引扫描索引扫描包括全索引扫描(full index scan FIS)、快速全索引扫描(fast full index scan FFIS)、索引范围扫描(index range scan)、索引唯⼀扫描(index unique scan)、索引跳跃式扫描(index skip scan)、位图索引扫描(bitmap index scan)[如何创建索引]创建表:create table person (id int, sex char(1), name char(10));创建索引:create index person_index on person (id);查看创建的表与索引:select object_name, object_type from user_objects;除了可以根据单个字段创建索引,也可以根据多列创建索引:create index person_index2 on person (sex, name);删除索引:drop index person_index;[创建索引的注意事项]1. 建⽴索引的⽬的是为了提⾼查询效率,但建⽴的索引过多会影响插⼊和删除数据的速度,这是因为我们修改表数据时,索引也要跟着修改,所以创建索引的时候我们需要权衡是查询多还是修改多。
oracle 索引 添加 原则

oracle 索引添加原则索引是数据库中一种重要的对象,对于查询和数据的获取过程有着重要的作用。
因此,对于索引的添加原则必须要有所掌握。
本文将从以下几个方面来探讨oracle索引的添加原则。
一、索引的选择原则oracle索引添加的第一原则是选择合适的索引。
选择合适的索引需要考虑到几个因素:(1)数据的唯一性。
如果数据具有唯一性,就应该选择唯一性索引。
否则如果选择非唯一性索引,则会导致性能的降低。
(2)数据类型。
索引的类型要根据数据类型来选择。
(3)数据分布情况。
如果数据分布均匀,就不应该建立索引。
反之,如果数据分布极不均匀,就应该建立索引。
(4)数据访问方式。
建立索引时要综合考虑数据的访问方式,避免创建不必要的索引。
二、索引的原则索引的主键是数据库的一个关键组件,要遵循以下几个原则:(1)保证索引的唯一性。
主键索引必须保证数据的唯一性,避免出现重复数据的情况。
(2)保证索引的稳定性。
主键索引一旦建立后,就不能轻易地修改或者删除。
否则会影响数据库的稳定性。
(3)保证索引的实用性。
主键索引必须要实用,要符合数据库的实际情况。
否则建立了没有意义的主键索引,会浪费资源和时间。
三、索引的创建原则在创建索引时,需要考虑以下几个方面:(1)尽量选择合适的列作为索引列。
一般来说,主键列和外键列都可以作为索引列。
(2)对于最常用的搜索条件,建立特殊索引。
例如:联合索引、覆盖索引、分区索引等等。
(3)在建立索引时,需要注意索引的长度。
索引长度过长会导致查询速度变慢。
(4)建立索引前,需要考虑到表中数据的行数。
如果数据行数较少,不建议建立索引。
(5)建立索引后,需要定期维护和优化索引。
需要经常性的清除索引空间,以提高查询效率。
四、批量删除索引的原则删除索引是在数据库中进行维护和优化的重要工作,但需要遵循以下几个原则:(1)避免错误删除索引。
在删除索引前,需要卸载外键和约束。
(2)删除索引前,要确保需要删除的索引没有任何数据依赖关系。
oracle索引建立原则

oracle索引建立原则
索引是数据库中一种很重要的数据结构,能够提高查询速度和性能。
在Oracle数据库中,索引的建立需要遵循一定的原则。
1. 针对查询频率高的列建立索引
对于经常被查询的列,建立索引能够大大提高查询速度和效率。
在数据库设计时,需要考虑到经常被查询的列,如主键列、外键列、经常作为查询条件的列等,都需要建立索引。
2. 避免对小表建立索引
对于小表来说,建立索引可能会降低性能而不是提高性能。
因为小表的数据量很少,查询速度本来就很快,如果再建立索引,反而会增加额外的开销,降低性能。
3. 建立复合索引
复合索引是指建立在多个列上的索引。
如果在查询中需要同时使用多个列作为查询条件,建立复合索引能够大大提高查询效率。
但是需要注意,复合索引的列顺序需要考虑到查询中的顺序,才能最大程度地提高查询效率。
4. 避免对频繁更新的列建立索引
对于频繁更新的列,如时间戳、日志等,建立索引会增加额外的开销,降低性能。
因此,在设计表结构时,需要根据实际情况选择是否建立索引。
5. 定期维护索引
索引是需要定期维护的,因为索引随着数据库的使用而变得越来
越庞大,可能会导致查询性能下降。
定期维护索引可以删除不必要的索引、优化索引等,提高查询性能。
总之,在Oracle数据库中,索引的建立需要根据实际情况进行,需要考虑到查询频率、表大小、列的更新频率等因素,才能最大程度地提高查询效率和性能。
Oracle数据库中建立索引的基本方法讲解

Oracle数据库中建⽴索引的基本⽅法讲解怎样建⽴最佳索引?1、明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);2、创建基于函数的索引常⽤与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;3、创建位图索引对基数较⼩,且基数相对稳定的列建⽴索引时,⾸先应该考虑位图索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name;4、明确地创建唯⼀索引可以⽤create unique index语句来创建唯⼀索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;5、创建与约束相关的索引可以⽤using index字句,为与unique和primary key约束相关的索引,例:alter table table_nameadd constraint PK_primary_keyname primary key(field_name)using index tablespace tablespace_name;如何创建局部区索引?1)基础表必须是分区表2)分区数量与基础表相同3)每个索引分区的⼦分区数量与相应的基础表分区相同4)基础表的⾃分区中的⾏的索引项,被存储在该索引的相应的⾃分区中,例如create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage(MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/如何创建范围分区的全局索引?基础表可以是全局表和分区表create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than ('0106')partition p01_idx vlaues less than ('0111')...partition p01_idx vlaues less than ('0401'))/如何重建现存的索引?重建现存的索引的当前时刻不会影响查询重建索引可以删除额外的数据块提⾼索引查询效率alter index idx_name rebuild nologging;对于分区索引alter index idx_name rebuild partition partition_name nologging;删除索引的原因?1)不再需要的索引2)索引没有针对其相关的表所发布的查询提供所期望的性能改善3)应⽤没有⽤该索引来查询数据4)该索引⽆效,必须在重建之前删除该索引5)该索引已经变的太碎了,必须在重建之前删除该索引语句:drop index idx_name;drop index idx_name partition partition_name;建⽴索引的代价?基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上。
应该在ORACLE数据库的哪些字段上建立索引where

给数据库建索引的规则博客分类:•Oracle建立索引常用的规则如下:1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:A、正确选择复合索引中的主列字段,一般是选择性较好的字段;B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;8、频繁进行数据操作的表,不要建立太多的索引;9、删除无用的索引,避免对执行计划造成负面影响;以上是一些普遍的建立索引时的判断依据。
一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。
因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。
另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大-------------------------------------------------------------------------------------------------------------------ORACLE查询的优化及索引作者:guojunfeng提交日期:2006-9-17 1:07:00申明:下面内容来自/keylife/iblog_show.asp?xid=92561.合理使用索引索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Oracle数据库中要合理的创建索引有如下几个要求。
一、根据表的大小来创建索引。
虽然给表创建索引,可以提高查询的效率。
但是数据库管理员需要注意的是,索引也需要一定的开销的。
为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。
这个认识是错误的。
恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。
因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。
所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。
一般来说,不需要为比较小的表创建索引。
如在一个ERP系统的数据库中,department表用来存储企业部门的信息。
一般企业的部分也就十几个,最多不会超过一百个。
这100条记录对于人来说,可能算是比较多了。
但是对于计算机来说,这给他塞塞牙缝都还不够。
所以,对类似的小表没有必要建立索引。
因为即使建立了索引,其性能也不会得到很大的改善。
相反索引建立的开销,如维护成本等等,要比这个要大。
也就是说,付出的要比得到的多,显然违反常理。
另外,就是对于超大的表,也不一定要建立索引。
有些表虽然比较大,记录数量非常的多。
但是此时为这个表建立索引并一定的合适。
如系统中有一张表,其主要用来保存数据库中的一些变更信息。
往往这些信息只给数据库管理员使用。
此时为这张表建立索引的话,反而不合适。
因为这张表很少用到,只有在出问题的时候才需要查看。
其次其即使查看,需要查询的纪录也不会很多,可能就是最近一周的更新记录等等。
对于对于一些超大的表,建立索引有时候往往不能够达到预计的效果。
而且在打表上建立索引,其索引的开销要比普通的表大的多。
那么到底是否给大表建立索引呢?笔者认为,主要是看两个方面的内容。
首先是需要关注一下,在这张大表中经常需要查询的记录数量。
一般来说,如果经常需要查询的数据不超过10%到15%的话,那就没有必要为其建立索引的必要。
因为此时建立索引的开销可能要比性能的改善大的多。
这个比例只是一个经验的数据。
如果数据库管理员需要得出一个比较精确的结论,那么就需要进行测试分析。
即数据库管理员需要测试一下全表扫描的时间,看看其是否比建立索引后的查询时间要长或者短。
如果是长的话,则说明有建立索引的必要。
但是如果没有的话,则说明还是全表扫描速度来的快。
此时也就没有必要建立索引了。
总之,在考虑是否该为表建立索引时,一般来说小表没有建立索引的必要。
而对于打表的话,则需要进行实际情况实际分析。
简单一点的,可以根据大致的比率来确定。
如果要精确一点的,则可以进行全表扫描性能分析,以判断建立索引后是否真的如预期那样改善了数据库性能。
二、根据列的特征来创建索引。
列的特点不同,索引创建的效果也不同。
数据库管理员需要了解为哪些列创建索引可以起到事倍功半的效果。
同时也需要了解为哪些列创建索引反而起到的是事倍功半的效果。
这有利于他们了解到底给为怎么样的字段建立索引。
根据笔者的经验,往往为如下特征的列创建索引能够起到比较明显的效果。
如对于一些重复内容比较少的列,特别是对于那些定义了唯一约束的列。
在这些列上建立索引,往往可以起到非常不错的效果。
如对于一些null值的列与非Null 值的列混合情况下,如果用户需要经常查询所有的非Null值记录的列,则最好为其设置索引。
如果经常需要多表连接查询,在用与连接的列上设置索引可以达到事半功倍的效果。
可见,索引设置的是否恰当,不仅跟数据库设计架构有关,而且还跟企业的经济业务相关。
为此,对于一些套装软件,虽然一开始数据库管理员已经做了索引的优化工作。
但是随着后来经济数据的增加,这个索引的效果会越来越打折扣。
这主要是因为记录的表化影响到了索引优化的效果。
所以笔者建议各位数据库管理员,即使采用的是大牌软件公司的套装软件,也需要隔一段时间,如一年,对数据库的索引进行优化。
该去掉的去掉,该调整的调整,以提高数据库的性能。
如在数据库中有一张表是用来保存用户信息的。
其中有个字段身份证号码,这是一个唯一的字段。
在数据库设计时,给这个字段创建了索引。
但是当这个数据库投入使用之后,用户不怎么输入用户的身份证号码。
而且平时也基本不按这个号码来进行查询。
当记录月来月多时,这个身份证号码上的索引字段不但不能够改善数据库的查询性能,反而成了鸡肋。
对于这些有很多NULL值的列,而且不会经常查询所有的非NULL值记录的列,数据库管理员要下决心,即使清除这些列上的索引。
所以说索引的优化与调整是一个动态的过程,并不是说数据库设计好之后就不需要经过调整。
数据库管理员往往需要根据记录的变化情况,来进行适当的变更。
以提高索引的效果。
三、在一个表上创建多少索引合适?
虽然说,在表上创建索引的数量没有限制,但是决不是越多越好。
也就是说,在创建索引这项事情上,1+1〉2往往不成立。
有时候,创建索引越多,其可能会得到适得其反的效果。
那么在一个表上,到底给创建多少索引合适呢?这个没有一个明确的标准。
而是需要数据库管理员根据实际的用途以及数据库中记录的情况,来进行判断。
通常来说,表的索引越多,其查询的速度也就越快。
但是,表的更新速度则会降低。
这主要是因为表的更新(如往表中插入一条记录)速度,反而随着索引的增加而增加。
这主要是因为,在更新记录的同时需要更新相关的索引信息。
为此,到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得一个均衡点。
如对于一些数据仓库或者决策型数据库系统,其主要用来进行查询。
相关的记录往往是在数据库初始化的时候倒入。
此时,设置的索引多一点,可以提高数据库的查询性能。
同时因为记录不怎么更新,所以索引比较多的情况下,也
不会影响到更新的速度。
即使在起初的时候需要导入大量的数据,此时也可以先将索引禁用掉。
等到数据导入完毕后,再启用索引。
可以通过这种方式来减少索引对数据更新的影响。
相反,如果那些表中经常需要更新记录,如一些事务型的应用系统,数据更新操作是家常便饭的事情。
此时如果在一张表中建立过多的索引,则会影响到更新的速度。
由于更新操作比较频繁,所以对其的负面影响,要比查询效率提升要大的多。
此时就需要限制索引的数量,只在一些必要的字段上建立索引。
笔者在平时数据库优化时,往往会根据这些表的用途来为列设置索引。
可以查询相关的动态视图,看看对于这张表的操作,是更新操作(包括更新、删除、插入等等)占的比例大,还是查询操作占的比例大。
当过多的索引已经影响到更新操作的速度时,则数据库管理员就需要先禁用某些索引,以提高数据库的性能。
总之,在适当的表、适当的列上建立适当的索引。
这一句话包含的意思有很多,以上内容只是一部分内容。
俗话说,师傅领进门,修行靠自身。
笔者在这里指能够点到为止。
一些具体的索引优化内容还是需要各位读者在日常工作中去体会与总结。