diff --git "a/01\347\277\201\347\253\240\345\275\254/\347\254\224\350\256\260/2022-09-14 \345\210\206\351\241\265\346\237\245\350\257\242\347\264\242\345\274\225.md" "b/01\347\277\201\347\253\240\345\275\254/\347\254\224\350\256\260/2022-09-14 \345\210\206\351\241\265\346\237\245\350\257\242\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..c02d76f766a62aa3c72f191242f377254754458d --- /dev/null +++ "b/01\347\277\201\347\253\240\345\275\254/\347\254\224\350\256\260/2022-09-14 \345\210\206\351\241\265\346\237\245\350\257\242\347\264\242\345\274\225.md" @@ -0,0 +1,114 @@ +# 分页查询 + +## 分页方案一 + +### **使用top分页** + +```sql +declare @PageSize int = 5 -- 每页5条 +declare @PageIndex int = 2 --第2页 +select top(@PageSize) * from Student +where Stuid not in (select top(@PageSize)*(@PageIndex-1)) StuId from Student +``` + +## 分页方案二 + +### **使用row_number分页** + +```sql +declare @PageSize int = 5 +declare @PageIndex int = 3 +select * from +(select ROW_NUMBER() over(order by StuId) RowId,*from Student) as Temp +where RowId between (@PageIndex-1)*@PageSize+1 and @PageIndex*PageSize +``` + +# 索引 + +## 什么是索引? + +汉语字典中的汉字按页存放,一般都有汉语拼音目录(索引)、偏旁部首目录等我们可以根据拼音或偏旁部首,快速查找某个字词。 + +![](https://gitee.com/snailclass/tuchuang/raw/master/img/book1-2022-9-1310:41:20.png) + +索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到需要的内容。 + +**建立索引的作用如下**: + +- 提高查询速度 + +- 保证数据记录的唯一性 + +- 查询优化靠索引起作用 + +- 提高order by, group by 执行速度 + +## 索引分类 + +**索引主要分为两类**: + +- **聚集索引(clustered)**:根据数据行的键值在表或视图中的排序存储这些数据行,每个表只有一个聚集索引。聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序(类似字典中的拼音索引)(物理存储顺序)。 + + ![img](https://gitee.com/snailclass/tuchuang/raw/master/img/%E5%9B%BE%E7%89%872-2022-9-1316:27:08.png) + +- **非聚集索引 (nonclusterted)**:具有独立于数据行的结构,包含非聚集索引键值,且每个键值项都有指向包含该键值的数据行的指针。(类似字典中的偏旁部首索引)(逻辑存储顺序)。 + + ![img](https://gitee.com/snailclass/tuchuang/raw/master/img/%E5%9B%BE%E7%89%872-2022-9-1316:27:08.png) + +**其它类型的索引**: + +- 按照数据唯一性分类:唯一索引、非唯一索引 +- 按键列个数区分:单列索引,多列索引 + +- 其他分类:索引视图、包含性列索引、全文索引、XML索引等 + +## 索引的创建与使用 + +- 索引的创建 + +```sql +--01创建索引基本语法 +CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] +INDEX ON ( [ASC|DESC][,...n]) + +--练习:为DBSTUDENT创建score字段索引 + +--练习:查找姓名为MikeSullivan、年龄17岁用户的peopleid +--分别使用单列索引和多列索引 +``` + +- 索引的使用 + +```sql +--使用索引进行查询 +``` + +- 索引的删除 + +```sql +--删除索引 +``` + + + +TIPS: + +- 索引信息存储在系统视图sys.indexes中 +- 可以使用系统存储过程:exec sp_helpindex查看当前表的索引 +- 填充因子:一页需要填充多少数据。 + + + +## 使用索引的注意事项 + +- 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。 +- 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。 +- 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好 +- 在where后使用or,导致索引失效(尽量少用or) +- 使用like ,like查询是以%开头,以%结尾不会失效 +- 不符合最左原则(多列索引) +- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 +- 使用in导致索引失效 + + +