惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
博客园_首页
美团技术团队
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
J
Java Code Geeks
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
G
Google Developers Blog
爱范儿
爱范儿
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - Bruce Xiao

select 语句的执行顺序 时间复杂度计算方法 活动图与流程图的区别 ASP.NET 应用程序生命周期概述 Tab标签 - Bruce Xiao - 博客园 过滤数据集DataTable方法 - Bruce Xiao - 博客园 Abstract 与 Vitrual 用法 在同一个DataSet中添加多个DataTable - Bruce Xiao - 博客园 C#文件读写常用类介绍[转] 获取当月的天数 C#读取二进制字节流 Oracle字符函数 分组合并字符串 分页控件 .net控件开发系列 事件处理机制 三个接口两个方法 xml讀寫實例 - Bruce Xiao - 博客园 SQL2005 分頁存儲過程 对xml操作的主要方法[轉] - Bruce Xiao - 博客园 SQL2005 新功能:行列轉換
谈SQL SERVER数据库中的索引
Bruce Xiao · 2007-12-18 · via 博客园 - Bruce Xiao

前日,朋友说要一个表有十几个列要被用来join,问我索引应该怎么建立?
给出的答案是:
建一个聚集索引(在最常用的列上而且重复得很少的列上),在再几个比较用得多的列上建非聚集索引(由于手机上回复,懒得写太多的字咯..),不知道说得对不对哦,请达人请正.

现作以下的整理,留作以后参考吧!!

1、索引分类:


    按照存储方式分为:聚集与非聚集索引
    按照维护与管理索引角度分为:唯一索引、复合索引和系统自动创建的索引
2、索引目的和代价:
    索引是表的一个概念部分,目的是减少全表扫描,用来提高检索数据的效率.

    它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引或者不合理的索引反而会使查询变慢.


常见的两种索引:聚集索引(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、何时使用聚集索引或非聚集索引
    以下,引用某位总结的表格:

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序
返回某范围内的数据 不应
一个或极少不同值 不应 不应
小数目的不同值 不应
大数目的不同值 不应
频繁更新的列 不应
外键列
主键列
频繁修改索引列 不应

  其实你只要知道:
1、聚集索引是存储的顺序和索引的顺序一致
2、非聚集索引是通过非聚集索引的指针来再来查询数据的存储位置
从原理的角度来分析一下如何才能更快地索引到存储位置,就可以把握这种什么时候需要建立哪一种索引的原则了.