索引的选择

索引的选择

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值