









前日,朋友说要一个表有十几个列要被用来join,问我索引应该怎么建立?
给出的答案是:
建一个聚集索引(在最常用的列上而且重复得很少的列上),在再几个比较用得多的列上建非聚集索引(由于手机上回复,懒得写太多的字咯..
),不知道说得对不对哦,请达人请正.
现作以下的整理,留作以后参考吧!!
1、索引分类:
常见的两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
3、聚集索引:(表中存储的数据按照索引的顺序存储,检索效率比普通索引高,但对数据新增/修改/删除的影响比较大)
1、一张表只能包含一个聚集索引,但并非只有一列,该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
2、在聚集索引中,表中各行的存储(物理)顺序与键值的逻辑(索引)顺序相同;
3、聚集索引通常可加快UPDATE和DELETE操作的速度,因为这两个操作需要读取大量的数据;
4、创建或修改聚集索引可能要花很长时间,因为执行这两个操作时要在磁盘上对表的行进行重组;
5、另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证. (其实本人也不知道为什么它就提供了唯一性验证呢,希望达人可以讲解.)
创建聚集索引的语法:
create CLUSTERED INDEX idximpID ON EMP(empID)
4、非聚集索引:
1、一个表可以最多可以创建249个非聚集索引
2、先建聚集索引才能创建非聚集索引(有待确认)
3、非聚集索引数据的物理存储顺序与非聚集索引列不同
4、数据存储地址与索引存储地址在不同位置
5、索引在叶节点上存储,在叶节点上有一个“指针”直接指向要查询的数据的存储位置
6、数据不会根据索引键的顺序重新排列数据
语法:
create NONCLUSTERED INDEX idxempID on emp(empID)
5、复合索引:如果在两上以上的列上创建一个索引,则称为复合索引。
那么,不可能有两行的姓和名是重复的
语法:
create index indexfullname on addressbook(firstname,lastname)
6、惟一索引:惟一索引可以确保索引列不包含重复的值.
可以用多个列,但是索引可以确保索引列中每个值组合都是唯一的
举个例子:姓和名是一个很好的例子,也很容易理解.
姓 名
李 二
张 三
王 五
语法: create unique index idxempid on emp(姓,名)
系统自建的索引:在使用T_sql语句创建表的时候使用PRIMARY KEY或UNIQUE约束时,会在表上自动创建一个惟一索引
7、生活中的索引--字典:
字典中按拼音查找--聚集索引
正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。
按部首---非聚集索引
这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”,可以通过目录索引到正文。
8、何时使用聚集索引或非聚集索引
以下,引用某位总结的表格:
| 动作描述 | 使用聚集索引 | 使用非聚集索引 |
| 列经常被分组排序 | 应 | 应 |
| 返回某范围内的数据 | 应 | 不应 |
| 一个或极少不同值 | 不应 | 不应 |
| 小数目的不同值 | 应 | 不应 |
| 大数目的不同值 | 不应 | 应 |
| 频繁更新的列 | 不应 | 应 |
| 外键列 | 应 | 应 |
| 主键列 | 应 | 应 |
| 频繁修改索引列 | 不应 | 应 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。