diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220914\347\264\242\345\274\225.md" "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220914\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..9306ed57e4d0e27e6f6dd6cf6e0e2b4e7ede012d --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220914\347\264\242\345\274\225.md" @@ -0,0 +1,165 @@ +# 五、索 引 + +**什么是索引?** + +索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的[集合](https://so.csdn.net/so/search?q=集合&spm=1001.2101.3001.7020)和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到需要的内容。 + +- **SQL Server中的数据**是**按页存放** +- **索引**:**是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据** +- **索引页**:数据库中存储索引的数据页:索引页类似于汉语字(词)典中按拼音或笔画排序的目录页 +- **索引的作用**:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能,保证数据记录的唯一性 + +**索引的优点** + +**优点** + +- 加快访问速度 +- 加强行的唯一性 + +**缺点** + +- 带索引的表在数据库中需要更多的存储空间 +- 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新 + +******* + +## (一)索引的类型 + +**唯一索引** + +- 唯一索引不允许两行具有相同的索引值 + +**主键索引** + +- 是唯一索引的特殊类型 + +**==聚集索引(Clustered)==** + +- 根据数据行的键值在表或视图中的排序存储这些数据行,每个表只有一个聚集索引。聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序(类似字典中的拼音索引)(物理存储顺序)。 +- 表中各行的物理顺序与键值的逻辑(索引)顺序相同 + +==**非聚集索引(Non-clustered)**== + +- 具有独立于数据行的结构,包含非聚集索引键值,且每个键值项都有指向包含该键值的数据行的指针。(类似字典中的偏旁部首索引)(逻辑存储顺序)。 +- 不改变表中数据行的物理存储位置,数据和索引分开存储,通过索引指向的地址与表中数据发生关系 + +**其它类型的索引**: + +- 按照数据唯一性分类:唯一索引、非唯一索引 +- 按键列个数区分:单列索引,多列索引 + +- 其他分类:索引视图、包含性列索引、全文索引、XML索引等 + +****** + +### 1.聚合索引和非聚合索引的区别 + +| 聚集索引 | 非聚集索引 | +| ---------------------------------- | -------------------------------------------- | +| 每个表只允许有一个聚集索引 | 最多可以有249个非聚集索引 | +| 物理地重排表中的数据以符合索引约束 | 创建一个键值列表键值指向数据在数据页中的位置 | +| 用于经常查找数据的列 | 用于从中查找单个值的列 | + +****** + +## (二)创建索引 + +1. 选择表点击"设计" +2. 索引/键 +3. 选择类型”添加“:可以添加两种索引 IX_grade[唯一索引],pk_grade[主键索引] + +****** + +## (三)SQL语句创建索引 + +语法: with[关于] + +```sql +create [unique][clustered][nonclustered] --索引类型 +index IX_name --索引名称IX开头 +on table_name(字段)--表示在哪张表的哪个列上 +[with fillfactor = x]--填充因子(表示启用x%) +``` + +| 类型 | 解释 | +| ------------ | ------------------------------------------------------------ | +| unique | 唯一索引 | +| clustered | 聚集索引 | +| nonclustered | 非聚集索引 | +| table_name | 数据表名,也可以是视图名 | +| fillfactor | 设置填充因子的大小,指定0-100之间的值,该值指示索引页填满的空间所占百分比,一般为30 | + +例:**在Student表的Sname列创建非聚集索引** + +```sql +create nonclustered index IX_Student_Sname +on Student(Sname) +with fillfactor=30 --填充因子30% +go +``` + +### 1.删除索引 + +```sql +drop index table_name.index_name +``` + +- 表和索引名称之间,用"."分隔 +- ==删除表时,该表的所有索引同时会被删除== + +**** + +### **2.使用索引查询** + +```sql +--指定按索引IX_Student_Sname查询 +select * from Student +with(index=IX_Student_Sname) +where Sname like '李'% +``` + +****** + +## (四)创建索引的原则 + +**按照下列标准选择建立索引的列** + +- 频繁搜索的列 +- 经常用作查询选择的列 +- 经常排序、分组的列 +- 经常用作连接的列(主键/外键) + +**请不要使用下面的列** + +- 创建索引仅包含几个不同值的列 +- 表中仅包含几行 + +************** + +### 1.使用经验 + +- 索引信息存储在系统视图sys.indexes中 +- 可以使用系统存储过程:exec sp_helpindex查看当前表的索引 +- 填充因子:一页需要填充多少数据。 + +### 2.注意事项 + +- 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。 +- 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。 +- 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好 +- 在where后使用or,导致索引失效(尽量少用or) +- 使用like ,like查询是以%开头,以%结尾不会失效 +- 不符合最左原则(多列索引) +- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 +- 使用in导致索引失效 + + + +- 查询时减少使用*返回全部列,不要返回不需要的列 +- 索引应该尽量小,在字节数小的列上建立索引(几个字节就好) +- WHERE子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前 +- 避免在ORDER BY子句中使用表达式 +- 根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理 + +******* +