合理的索引有助于晋升系统机能和可用水平,我工作中见过一个设计错误的索指导致sqlserver将一台4cpu的处事器资本用尽。 权威参考参见msdn: 1、评估索引自己的占用空间,当索引相对于其数据自己过大可能会无较着浸染。这种情形表此刻:表很小,索引列过多,索引碎片过多。当索引在select中不起浸染时,你还必需在insert和update、delete这些操作中去维护这些不起浸染的数据。 : y& S# E+ _+ h. f% f5 i 2、In语句不必然不能使用索引,where id in(1,2)和where id =1 or id=2是等效的,这里的in和not in的机能是不异的。而不能使用索引的原因是嵌套发芽: where id in(select 1 union select 2)。! W. A; ^, ^7 M: O |: @
3、解除嵌套发芽无法操作索引的法子是用exists子发芽,select * from tb1 a where exists(select 1 from tb2 where id=a.id)。而exists和not exists的机能和tb1的数据量无关,他们的机能分歧在于tb2中的数据量。8 z: A @0 P* J' M0 F3 s3 v6 d
4、Like子句可以操作索引,所以尽可能少用left,right和substring函数。 8 O2 u6 U, \/ T m- [/ H! X/ f; ` 5、函数不能使用索引,好比convert(varchar(7),date,120)=‘2008-06’,或者datediff函数、甚至和常量的加减乘除运算等,正确的做法是用斗劲符号或者尽可能把datediff之类的函数放到等号右边。' ?: I* B2 q+ x& u @) z! T
6、不用担忧隐式转换,它老是转换等号右边的。好比 where id=‘2’ 和where id=2是等效的。 7 h* y; e: d' c& J 7、聚积索引的发芽机能好于非聚积索引,可是维护价钱很大,对于他的数据改变会引起整行数据的物理位置移动。同时聚积索引还要为非聚积索引供给索引处事,所以尽量不用过大的列或过多的列作聚积索引。 8 I1 c! v7 ~. `+ r6 K: h 8、聚积索引可以极大优化大于,小于,group by和order by以及join语句的发芽机能。 p7 N* d0 R- G7 [: m7 j6 R& U" a
9、一张表只能由一个聚积索引。 k; \1 ~% }: \. W 10、独一索引有助于发芽优化。 - }( N& d2 O# y% m8 E1 H" L, U 11、连系索引的第一列可以零丁使用,其他的索引列在零丁的where子句中不起浸染。+ N8 ~# l$ S' _( L. L
12、索引的升序降序对order by子句的影响很大。+ x* n+ I& k1 Q- y" s7 b
13、合适特定前提的计较列也可以建树索引。