sql索引类型和使用说明

本文深入探讨了数据库索引的概念、特点、优缺点及分类,重点阐述了如何选择合适的索引以提升检索效率,同时提供了索引使用的指导原则与注意事项。
 

唯一索引:唯一索引不允许两行具有相同的索引值
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个

优点
加快访问速度
加强行的唯一性
缺点
带索引的表在数据库中需要更多的存储空间
操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新

请按照下列标准选择建立索引的列。
该列用于频繁搜索
该列用于对数据进行排序

一、索引的概念
        索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
二、索引的特点
    1.索引可以加快数据库的检索速度
    2.索引降低了数据库插入、修改、删除等维护任务的速度
    3.索引创建在表上,不能创建在视图上
    4.索引既可以直接创建,也可以间接创建
    5.可以在优化隐藏中,使用索引
    6.使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索引
    7.其他
三、索引的优点
    1.创建唯一性索引,保证数据库表中每一行数据的唯一性
    2.大大加快数据的检索速度,这也是创建索引的最主要的原因
    3.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    5.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。
四、索引的缺点
    1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
    2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
    3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
五、索引分类
    1.直接创建索引和间接创建索引
    直接创建索引: CREATE INDEX mycolumn_index ON mytable (myclumn)
    间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引
    2.普通索引和唯一性索引
    普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)
    唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用
    CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
    3.单个索引和复合索引
    单个索引:即非复合索引
    复合索引:又叫组合索引,在索引建立语句中同时包含多个字段名,最多16个字段
    CREATE INDEX name_index ON username(firstname,lastname)
    4.聚簇索引和非聚簇索引(聚集索引,群集索引)
   聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列
    CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH
    ALLOW_DUP_ROW(允许有重复记录的聚簇索引)
   非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
六、索引的使用
   1.当字段数据更新频率较低,查询使用频率较高并且存在大量重复值是建议使用聚簇索引
    2.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
    3.复合索引的前导列一定好控制好,否则无法起到索引的效果。如果查询时前导列不在查询条件中则该复合索引不会被使用。前导列一定是使用最频繁的列
    4.多表操作在被实际执行前,查询优化器会根据连接条件列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案
    5.where子句中对列的任何操作结果都是在sql运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被sql优化器优化,使用索引,避免表搜索(例:select * from record where substring(card_no,1,4)=’5378’
&& select * from record where card_no like ’5378%’)任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边
    6.where条件中的’in’在逻辑上相当于’or’,所以语法分析器会将in ('0','1')转化为column='0' or column='1'来执行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用column上的索引;但实际上它却采用了"or策略 ",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用 column上索引,并且完成时间还要受tempdb数据库性能的影响。in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引
    7.要善于使用存储过程,它使sql变得更加灵活和高效

### SQL Server 中常见的索引类型 SQL Server 提供了多种索引类型,每种类型都有其特定的用途适用场景。以下是常见的索引类型及其详细说明: #### 1. 聚集索引 (Clustered Index) 聚集索引定义了中数据的物理存储顺序。每个只能有一个聚集索引,因为数据行本身只能按照一种顺序进行物理排序。聚集索引通常用于那些需要按特定顺序访问数据的查询[^3]。 - **特点**:数据行在存储时是按索引键值的逻辑顺序排列的。 - **适用场景**:适合用于频繁进行范围查询或排序操作的列。 ```sql CREATE CLUSTERED INDEX idx_clustered ON table_name (column_name); ``` #### 2. 非聚集索引 (Nonclustered Index) 非聚集索引不改变中数据的物理顺序,而是创建一个逻辑顺序的索引结构。每个可以有多个非聚集索引。非聚集索引的叶子节点包含指向实际数据行的指针[^4]。 - **特点**:适用于加速除聚集索引之外的关键查询列的查找。 - **适用场景**:适合用于 WHERE 子句中频繁使用的列,或者 JOIN 操作中的连接列。 ```sql CREATE NONCLUSTERED INDEX idx_nonclustered ON table_name (column_name); ``` #### 3. 唯一索引 (Unique Index) 唯一索引确保索引列中的所有值都是唯一的。它可以是聚集索引或非聚集索引的一部分。如果尝试插入重复值,数据库将抛出错误[^3]。 - **特点**:强制列值的唯一性。 - **适用场景**:用于需要保证数据完整性且不允许重复值的列。 ```sql CREATE UNIQUE INDEX idx_unique ON table_name (column_name); ``` #### 4. 包含索引 (Included Columns Index) 包含索引是非聚集索引的一种扩展形式,允许在索引中包含额外的列(这些列不会影响索引键)。这种设计可以减少索引的大小并提高查询性能[^2]。 - **特点**:通过在索引中包含额外列,避免回操作,从而提升查询效率。 - **适用场景**:适用于覆盖查询(Index Covering Query),即查询的所有列都可以从索引中直接获取。 ```sql CREATE NONCLUSTERED INDEX idx_included_columns ON table_name (indexed_column) INCLUDE (included_column); ``` #### 5. 过滤索引 (Filtered Index) 过滤索引是一种优化的非聚集索引,仅对中满足特定条件的行建立索引。这可以显著减少索引的大小,并提高查询性能[^3]。 - **特点**:通过限制索引的范围来节省存储空间维护成本。 - **适用场景**:适合用于只针对部分数据进行查询的场景。 ```sql CREATE NONCLUSTERED INDEX idx_filtered ON table_name (column_name) WHERE condition; ``` #### 6. 全文索引 (Full-Text Index) 全文索引用于支持对文本数据进行高效的搜索操作。它允许用户执行复杂的查询,如模糊匹配、近义词搜索等[^3]。 - **特点**:支持复杂的文本搜索功能。 - **适用场景**:适用于需要对大量文本数据进行高效搜索的应用。 ```sql CREATE FULLTEXT INDEX ON table_name (column_name LANGUAGE language_id); ``` #### 7. 空间索引 (Spatial Index) 空间索引用于支持地理空间数据类型的查询操作。它可以帮助优化基于地理位置的查询性能[^3]。 - **特点**:专门用于处理地理空间数据。 - **适用场景**:适用于地理信息系统(GIS)相关的应用。 ```sql CREATE SPATIAL INDEX idx_spatial ON table_name (spatial_column); ``` ### 总结 SQL Server 提供了多种索引类型以适应不同的查询需求。选择合适的索引类型对于优化查询性能至关重要。在设计索引时,应考虑查询模式、数据访问频率以及更新操作的开销。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值