聚集、非聚集索引、唯一索引、复合索引、系统自建索引

本文深入探讨了数据库索引的原理与应用,包括聚集索引、非聚集索引、唯一索引、复合索引及系统自建索引的特性与创建方法。详细对比了聚集索引与非聚集索引在不同场景下的使用策略,提供了创建索引的多种方法,并通过实例展示了如何优化索引以提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:红色字体表示要特别注意点

 

索引是在数据库表或者视图上创建的对象,目的是为了加快对表或视图的查询的速度。

按照存储方式分为:聚集与非聚集索引
按照维护与管理索引角度分为:唯一索引、复合索引和系统自动创建的索引。

索引的结构是由:根节点--->非叶节点--->非叶节点--->叶节点

 

1、聚集索引:表中存储的数据按照索引的顺序存储,检索效率比普通索引高,但对数据新增/修改/删除的影响比较大。逻辑顺序决定了表中相应行的物理顺序
特点:
  (1) 一个表可以最多可以创建249个索引
  (2) 先建聚集索引才能创建非聚集索引
     (3) 非聚集索引数据与索引不同序
     (4) 数据与索引在不同位置
     (5) 索引在叶节点上存储,在叶节点上有一个"指针"直接指向要查询的数据区域
     (6) 数据不会根据索引键的顺序重新排列数据

     (7)如果在该字段上进行范围查询,或者该表很少做增删改

 创建聚集索引的语法:
   create NONCLUSTERED INDEX idximpID ON EMP(empID)
2、非聚集索引:不影响表中的数据存储顺序,检索效率比聚集索引低,对数据新增/修改/删除的影响很少
。是通过二叉树的数据结构来描述的,逻辑顺序,特点:
   (1) 无索引,数据无序
   (2) 有索引,数据与索引同序 
   (3) 数据会根据索引键的顺序重新排列数据
   (4) 一个表只能有一个索引
   (5) 叶节点的指针指向的数据也在同一位置存储
语法:
create CLUSTERED INDEX idxempID on emp(empID)
3、惟一索引:惟一索引可以确保索引列不包含重复的值.
可以用多个列,但是索引可以确保索引列中每个值组合都是唯一的
姓   名
李   二
张   三
王   五
语法: create unique index idxempid on emp(姓,名)

4、复合索引:如果在两上以上的列上创建一个索引,则称为复合索引。
那么,不可能有两行的姓和名是重复的
语法:
create index indxfullname on addressbook(firstname,lastname)

注意:如果把复合的聚集索引字段分开查询。
带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列):
    (1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5''
    查询速度:2513毫秒
    (2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5'' and neibuyonghu=''办公室''
    查询速度:2516毫秒
    (3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''
    查询速度:60280毫秒
  从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

5、系统自建的索引:在使用T_sql语句创建表的时候使用PRIMARY KEY或UNIQUE约束时,会在表上自动创建一个惟一索引
自动创建的索引是无法删除的
语法:
create table ABc
( empID int primary key,
   firstname varchar(50)UNIQUE,
   lastname   varchar(50)UNIQUE,
)
这样的结果就出来了三个索引,但只有一个聚集索引哦


6、创建索引的方法:
1、企业管理器中
(1)右击某个表,所有任务---管理索引,打开管理索引,单击“新建”就可以创建索引
(2)在设计表中进行设计表,管理索引/键
(3)在关系图中,添加表后右击关系图中的某个表,就有“索引/键”
(4)通过向导,数据库---创建索引向导
(5)通过T-SQL语句
2、能过“索引优化向导”来优化索引的向导,通过它可以决定选择哪些列做为索引列
 
 二、何时使用聚集索引或非聚集索引

下面的表总结了何时使用聚集索引或非聚集索引(很重要):

 

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

 

 

### 聚集索引非聚集索引复合索引的区别 #### 聚集索引 (Clustered Index) 聚集索引定义了数据在磁盘上的物理存储顺序,这意味着表中的行按照聚集索引列的值进行排序并存储。一个表只能拥有一个聚集索引,因为数据的实际排列方式只能有一种[^1]。 对于InnoDB引擎而言,如果未显式指定,则MySQL会自动创建基于ROWID(内部行标识符)的隐含聚集索引来组织数据。这种设计使得通过聚集索引访问的数据具有较高的读取效率,因为它可以直接定位到实际的数据位置而无需额外查找其他地方的信息[^3]。 #### 非聚集索引 (Non-Clustered Index) 聚集索引不同,非聚集索引并不影响底层数据的物理布局;相反,它维护着指向真实数据记录的位置指针列表。当查询使用非聚集索引时,首先会在该索引中快速定位目标项对应的主键或ROWID,然后再回到原始表格去获取完整的行数据——这一过程被称为“回表操作”。因此,在某些情况下,频繁执行此类操作可能会降低性能[^2]。 #### 复合索引 (Composite Index) 复合索引是指在一个字段组合上建立的单个索引结构。其工作原理类似于多维数组寻址机制:先按第一个字段排序,相同的第一字段下再依据第二个字段继续分组...以此类推直到最后一个参构建此索引的属性为止。合理利用复合索引能够极大地提升涉及多个条件过滤的SQL语句的速度,特别是那些经常一起使用的列作为联合约束的情况更为明显. ### 使用场景分析 - **聚集索引适用场合** - 当应用程序主要依赖于特定字段范围扫描或者频繁地根据某个字段进行全量遍历时; - 对于唯一性高的字段如`PRIMARY KEY`常适合设置成聚集索引以确保高效检索。 - **非聚集索引适合情况** - 如果存在大量随机点查需求但又不想改变现有数据分布模式的话可以选择聚簇形式; - 同一时间可能需要支持多种不同的查询路径而不局限于单一维度排序时也推荐采用这种方式增加灵活性。 - **复合索引最佳实践** - 建议针对最常用于WHERE子句内联接/筛选条件的一系列连续字段创建复合索引; - 注意遵循左前缀原则即越左边的成员应当更倾向于出现在查询条件之中从而最大化命中率减少不必要的I/O开销。 ```sql -- 创建复合索引的例子 CREATE INDEX idx_composite ON orders(order_date, customer_id); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值