1、主键选取
2、聚集索引必须建立在主键上吗?
聚集索引是将索引列数据进行排序后放入B树;
聚集索引可以不建立在主键上,主键的作用是唯一标识符,只是一般将聚集索引设置在主键上。
3、聚集索引可以有重复值吗
可以,但是会耗费更多内存,推荐聚集索引所在列使用唯一键。
4、强制走索引
查询不走索引时,可在查询语句后添加WITH (INDEX(QueryAA_Index)) ,强制执行索引。
(1)下面给出查询语句实例和逻辑读取次数
--数据表为BasicMsg20170331,且在AA字段上有非聚集索引
SELECT * FROM BasicMsg20170331 WHERE AA=7867695
--Table 'BasicMsg20170331'. Scan count 1, logical reads 4881, physical reads 0, read-ahead reads 4888, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SELECT * FROM BasicMsg20170331 WITH (INDEX(QueryAA_Index)) WHERE AA=7867695 -- AND RecvTime<=89600000
--Table 'BasicMsg20170331'. Scan count 1, logical reads 1774, physical reads 10, read-ahead reads 20, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0
从上结果可以看出,当添加了强制执行索引时,逻辑读变少了很多,但是物理读取增加了10次。
PS:物理读是内容不在内存中,要去硬盘中读入内存,会 增加IO开销
逻辑读内容在内存中,不需要读硬盘 ,无IO开销