索引的选择

索引的选择

索引创建需要综合考虑到读写操作比例来定。

SQL Sever索引类型有:唯一索引,主键索引,聚集索引,非聚集索引。

若是高频率的查询需求(例如首页),通常会因为更新的频率过高,而导致存在一定的阻塞,或者产生死锁。
读写分离(通过数据库的发布订阅拷贝多一份数据来实现,虽然说数据拷贝多了一份,而且读库的索引也同样需要创建
但是数据插入时不会有太多的等待与死锁的出现,因为写库时不需要创建太多的索引,而且减少了资源的争夺)

聚集索引

聚集索引也叫聚簇索引。是按顺序存储的
定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

当聚集表中,新增数据比较频繁时,建议使用数值类型(INT,BIGINT, 等类型)

《SQL Server性能调优实战》P198

GUID主键情况

严重杜绝把聚集索引建在GUID列
聚集索引添加到每张表中都会有【数据产生时间】列

出于归档考虑我的每张表中都会有【数据产生时间】列,将原属于主键的聚集索引添加到该类上,保障了聚集索引的正常工作。

非聚集索引

非聚集(unclustered)索引。

定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

复合索引(覆盖索引)

建立两列以上的索引,即可查询复合索引里的列的数据而不需要进行回表二次查询,如index(col1, col2),执行下面的语句

在SQL Server中还有include的用法,可以把非聚集索引里包含的列包含进来,而不一定需要建立复合索引。

常用SQL语句

-- 查看表是否存在索引
EXEC sp_helpindex 'TestQuestion'

--建立聚集索引 
// DROP_EXISTING = {ON |OFF }:表示如果这个索引还在表上就 drop 掉然后在 create 一个新的。 默认为 OFF。
create clustered index PK_EXAMSTUDENT on ExamStudentResit(ExamStudentID) with (drop_existing=on)
create clustered index PK_EXAMSTUDENT on ExamStudentResit(ExamStudentID)

// unique 代表唯一
create unique clustered index idx_createdon on ExamQuesAsk(CreatedOn,SortID) with (drop_existing=on)

--建立非聚集索引
create index idx_student_id on ExamQuesAsk(ExamStudentID)

--建立非聚集索引,2个字段
create index idx_appdevice_id on AppDevice(DeviceId,AppId)

参考资料

《SQL Server性能调优实战》

聚集索引与非聚集索引的总结
https://www.cnblogs.com/s-b-b/p/8334593.html

【SqlServer】SqlServer索引的创建、查看、删除
https://www.cnblogs.com/HDK2016/p/7831052.html

通过非聚集索引让select count(*) from 的查询速度提高几十倍、甚至千倍
https://blog.csdn.net/sqlserverdiscovery/article/details/12646371

sqlserver索引小结
https://www.cnblogs.com/lx823706/p/5531395.html

posted @   lvye1221  阅读(23)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示