创建索引时的注意事项

1、始终包含聚集索引
当表中不包含聚集索引时,表中的数据是无序的,这会降低数据检索效率。即使通过索引缩小了数据检索的范围,但由于数据本身是无序的,当从表中提取实际数据时,会产生频繁的定位问题,这也使得SQL Server基本上不会使用无聚集索引表中的索引来检索数据。
2、保证聚集索引唯一
由于聚集索引是非聚集索引的行定位器,如果它不唯一,则会使行定位器中包含辅助数据,同时也导致从表中提取数据时,需要借助行定位器中的辅助数据来定位,这会降低处理效率。
3、保证聚集索引最小
每个聚集键值都是所有非聚集索引的叶结点记录,它越小,意味着每个非聚集索引的索引叶包含的有效数据越多,这对于提升索引效率很有好处。
4、覆盖索引
覆盖索引是指索引中的列包含了数据处理中涉及的所有列,覆盖索引相当原始表的一个子集,由于这个子集中包含了数据处理涉及的所有列,因此操作这个子集就可以满足数据处理需要。一般而言,如果大多数处理都只涉及某个大表的某些列,可以考虑为这些列建立覆盖索引。
覆盖索引的建立方法是将要包含的列中的关键列做为索引键列,将其他列做为索引的包含列(使用索引创建语句中的INCLUDE子句)。
5、适量的索引
当数据发生变化时,SQL Server会同步维护相关索引中的数据,过多的索引会加影响数据变更的处理效率。因此,只应该在经常使用的列上建立索引。
适量的索引还体现在对索引列的组合方式的控制上。例如,如果有两个列col1和col2,这两个列的组合会产生三种使用情况:单独使用col1、单独使用col2及同时使用col1和col2。如果有为每种情况都建立索引,则需要建立三个索引。但也可以只建立一个复合索引(col1, col2),这样能够依次满足col1+col2、col1、col2这三种方式的查询,其中,col2利用这个查询会比较勉强(还要配合单独的统计),可以视实际情况确定是否需要为col2建立单独的索引。
特别注意:
不要建立重复索引,目前最常见的重复索引是单独为某个列建立主键和聚集索引
与直接从表中提取数据相比,根据索引检索数据,多了一个索引检索的过程,这个过程要求能够尽量缩小数据检索范围,并且使用最少的时间,这样才能真正保证能够通过索引提高数据检索效率。
实现上述目的,对于索引键列的选择,应该遵循如下原则:
选择性原则
选择性是满足条件的记录占总记录数的百分比,这个比率应该尽可能低,这样才能保证通过索引扫描后,只需要从基础表提取很少的数据。
如果这个比率偏高,则不应该考虑在此列上建立索引。
数据密度原则
数据密度是指列值唯一的记录占总记录数的百分比,这个比率越高,则说明此列越适合建立索引。
在考虑数据密度的时候,还要注意数据分布的问题,只有经常检索的密度高时,才适合建立索引。例如,如果一张表有10万记录,虽然某个列不重复的记录有9万条,但如果经常检索的2万条记录,其不重复的列值才几十条的话,这个列是不太适合建立索引的。另一种情况是,整体数据密度不大,但经常检索的数据的密度大,例如订单的状态,一般来说,订单的状态就几种,但已经Close的订单往往占整个数据的绝大部分,但数据处理的时候,基本上都是检索未Close的订单,这种情况下,为订单的状态列建立索引还是比较有效的(SQL Server 2008中,可以为这种列建立具有更佳效果的筛选索引)。
6、索引键列大小
一般不宜为超过100Byte的列建立索引。
7、复合索引键列顺序
在索引中,索引的顺序主要由索引中的每一个键列确定,因此,对于复合索引,索引中的列顺序是很重要的,应该优先把数据密度大,选择性列,存储空间小的列放在索引键列的前面。

时间: 2024-11-05 16:32:38

创建索引时的注意事项的相关文章

物化视图,索引视图,函数索引,创建索引时使用DESC

老板交给的一个任务,搜了一下资料,觉得还是总结一下比较好.假如以后用到了呢?围绕两个主题:一是视图上能够建索引,二是在创建索引时是否可以使用DESC关键字. 一.能否在视图上创建索引 因为普通的视图并没有存储实际的信息,它所操作的数据来自于基本表,所以在普通视图上不可以创建索引. 在oracle中执行如下的语句,会报"视图不适用于此处"的错误 create view test_car as select license from cars; create index index_vew

索引深入浅出(10/10):创建索引时,键列位置的重要性

在过去的文章里,我们已经讨论了各种不同索引.这个文章里,我们会讨论下键列的顺序(索引列的顺序).索引键列的顺序基于数据的访问模式还有你想如何组织数据. 对于索引键列的顺序,常规指导方针就是把查询用到最多的列放在第一列.这并不是说,所有你索引里的唯一ID列就应该是第一列.优化器是基于索引上的可用统计信息来选择索引的.统计信息会给你键列的使用密度信息,即索引的唯一性,直方图(histogram )用来存储那一列值分布情况信息. 让我们用customer表做例子,它保存来自各个国家的客户信息. 1 C

转载——索引的原理及索引建立的注意事项

转载自:http://www.jb51.net/article/30905.htm 聚集索引,数据实际上是按顺序存储的,数据页就在索引页上.就好像参考手册将所有主题按顺序编排一样.一旦找到了所要搜索的数据,就完成了这次搜索,对于非聚集索引,索引是安全独立于数据本身结构的,在索引中找到了寻找的数据,然后通过指针定位到实际的数据 聚集索引,数据实际上是按顺序存储的,数据页就在索引页上.就好像参考手册将所有主题按顺序编排一样.一旦找到了所要搜索的数据,就完成了这次搜索,对于非聚集索引,索引是安全独立于

Elasticsearch之curl创建索引库和索引时注意事项

前提, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 注意事项 1.索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号 2.如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST参数 curl -XPOST http://192.168.80.200:9200/zhouls/emp/ -d '{"name" : "tom"}' 3.如果想要确定我们创建的都是全新的数据 1:使用随机I

使用mysql索引技巧及注意事项

一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响不大.但是当数据量和访问量剧增的时候,就会发现mysql变慢,甚至down掉,这就必须要考虑优化sql了,给数据库建立正确合理的索引,是mysql优化的一个重要手段. 索引的目的在于提高查询效率,可以类比字典,如果要查"mysql

SQL语句-创建索引

  语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100GO USE 库名GOIF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--检测是否已经存在IX_TEST_TNAME索引DROP INDEX TEST.IX_TEST_TNAME--如果存在则删除 --创建索引CREATE NONCLUSTERED INDEX IX_TEST_TNAME

mongo之 前后台创建索引 --noIndexBuildRetry

在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程.MongoDB也不例外.因此,MongoDB索引的创建有两个选择,一个是前台方式,一个是后台方式.那这两种方式有什么差异呢,在创建索引是是否能观察到索引完成的进度呢.本文将是基于此的描述,同时也描述了索引创建相关的注意事项. 一.索引创建方式 前台方式 缺省情况下,当为一个集合创建索引时,这个操作将阻塞其他的所有操作.即该集合上的无法正常读写,直到索引创建完毕 任意基于所有数据库申请读或写锁都将等待直到前台完成索引创建操作 后

Elasticsearch搜索API使用一:创建索引并指定索引类型的mapping

ES默认是动态创建索引和索引类型的mapping的.这就相当于无需定义Solr中的Schema,无需指定各个字段的索引规则就可以索引文件,很方便.但有时方便就代表着不灵活.比如,ES默认一个字段是要做分词的,但我们有时要搜索匹配整个字段却不行.如有统计工作要记录每个城市出现的次数.对于NAME字段,若记录"new york"文本,ES可能会把它拆分成"new"和"york"这两个词,分别计算这个两个单词的次数,而不是我们期望的"new

创建索引和主键

一.      主建的创建与删除 1.       创建表时同时创建主键(加primary key) Create Table Book ( ID int identity(1,1) primary key, Name nvarchar(50) not null, StudentID int not null ) 2.       用SQL语句单独创建主键 1)创建主键同时会自动在该主键上创建聚集索引 语句:alter table [表名] add constraint PK_Book_ID p