代码改变世界

SQL创建几种常见索引

2023-08-30 09:48  古兆洋  阅读(1173)  评论(0编辑  收藏  举报

转自:https://blog.csdn.net/whlqunzhu/article/details/123061559

索引创建

1、主键索引:

alter table table_name add primary key (column)

2、唯一索引

alter table table_name add unique (column)

3、普通索引:

alter table table_name add index index_name (column)

4、全文索引:

alter table table_name add fulltext (column)

5、联合索引

alter table table_name add index index_name (column1,column2,column3)

索引删除

alter table table_name drop index index_name;

查询优化器如何使用索引

转自:https://learn.microsoft.com/zh-cn/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15

设计良好的索引可以减少磁盘 I/O 操作,并消耗更少的系统资源。 因此,这些索引可提高查询性能。 索引对于包含 SELECT、UPDATE、DELETE 或 MERGE 语句的各种查询非常有用。

考虑数据库中的 AdventureWorks2022 查询 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 。 执行此查询时,查询优化器会评估用于检索数据的每个可用方法,并选择最有效的方法。 该方法可以是表扫描,也可以扫描一个或多个索引(如果存在)。

在表扫描期间,查询优化器读取表中的所有行,并提取满足查询条件的行。 表扫描会生成许多磁盘 I/O 操作,并且可能占用大量资源。 但是,如果查询的结果集是表中行的百分比较高,则表扫描可能是最有效的方法。

当查询优化器使用索引时,它会搜索索引键列,查找查询所需的行的存储位置,并从该位置提取匹配的行。 通常,搜索索引的速度比搜索表快得多。 与表不同,索引通常包含每行很少的列,行按排序顺序排列。

执行查询时,查询优化器通常选择最有效的方法。 但是,如果没有索引可用,查询优化器必须使用表扫描。 你的任务是设计和创建最适合你的环境的索引,以便查询优化器可以选择从中选择的有效索引。SQL Server 提供 数据库引擎优化顾问 ,以帮助分析数据库环境和选择适当的索引。

SQL Server 创建索引的 5 种方法

转自:https://www.cnblogs.com/zxtceq/p/6606689.html

下面是覆盖索引,筛选索引的创建

创建覆盖索引

create index index_name on table_Name (columnName ASC|DESC[,......]) include(column_Name_List)with (drop_existing = on);

create index ix_cov_Employee_ID_Name on Employee (ID) include(Name);
go

首先,覆盖索引它只是非聚集索引的一种特别形式。下文说的非聚集索引不包涵覆盖索引,当然这个约定只适用于这一段话,这样做的

目的是为了说明各中的区别。

首先:

               1、非聚集索引不包涵数据,通过它找到的只是文件中数据行的引用(表是堆的情况下)或是聚集索引的引用,SQL Server

                    要通这个引用去找到相应的数据行。

               2、正因为非聚集索引它没有数据,才引发第二次查找。

               3、覆盖索引就是把数据加到非聚集索引上,这样就不需要第二次查找了。这是一种以空间换性能的方法。非聚集索引也是。

                    只是做的没有它这么出格。

筛选索引

create index index_name on table_name(columName) where boolExpression;

create index ix_Employee_ID on Employee(ID) where ID>100 and ID< 200;
go

只对热点数据加索引,如果大量的查询只对ID 由 100 ~ 200 的数据感兴趣,就可以这样做。

1、可以减小索引的大小

 2、为据点数据提高查询的性能。 

总结:

      BTree 索引有聚集与非聚集之分。

                                               就查看上到聚集索引性能比非聚集索引性能要好。

      非聚集索引分    覆盖索引,唯一索引,复合索引(当然聚集索引也有复合的,复合二字,只是说明索引,引用了多列),一般非聚集索引

                                               就查看上到非聚集索引中覆盖索引的性能比别的非聚集索引性能要好,它的性能和聚集索引差不多,可是

                                               它也不是’银弹‘ 它会用更多的磁盘空间。