索引的选择

索引的选择

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

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

猜你喜欢

转载自blog.csdn.net/lvye1221/article/details/86536376