|
毛主席教导我们:
"按照唯物辩证法的观点看来,矛盾存在于一切客观事物和主观思维的过程中,矛盾贯串于一切事物的始终,这是矛盾的普遍性和绝对性。矛盾着的事物及其每一个侧面各有其特点,这是矛盾的特殊性和相对性。矛盾着的事物依一定的条件有同一性,因此能够共居于一个统一体中,又能够互相转化到相反的方面去,这又是矛盾的特殊性和相对性。"
"中国的教条主义和经验主义的同志们所以犯错误,就是因为他们看事物的方法是主观的、片面的和表面的。"[/COLOR]
索引可能引起系统性能下降--即使是针对查询[/COLOR][/FONT][/SIZE]
索引的本意是为了提高性能的, 但是它也可能引起性能的下降.
最简单的, 它对增, 删, 改的性能起负作用.
深入一点, 即使对于查询, 在数据量特别小和特别大的两个极端情况下, 索引一样是不利的.
再深入一点, 对于一般的系统, 索引一样可能对查询产生负面影响--对数据库内部优化器产生影响, 误导优化器选择不良的执行路径. 具体的说: 索引的存在影响某个路径的cost值, cost的值是优化器作决定的依据. 由于cost取值本身是不准确的, 或者说cost不能100%反映索引对性能的影响, 最终索引的存在有可能反而误导了优化器.举个例子(实际情况要复杂很多的,这里只是做为解释用):
路径a 全表扫描 cost 100
路径b 索引一 cost 50 <--数据库选用了它
增加一个索引
路径c 索引二 cost 45 <---数据库认为它cost小过索引一, 选了它.问题来了,45和50大家都是估计的, 没真正执行前是不知道真正的cost的, 索引二的cost可能是45也可能大于50. 或者说选索引二可能快过选索引一,也可能慢过选索引一.
那还要cost干什么?------cost存在的价值在于大部分情况下他的值的倾向性是对的.数据库根据它作猜测,猜中的机会大于猜错的机会.
什么时候加索引, 如何加?[/COLOR]
最经典的说法: 数据库慢了, 加索引. 加索引就快了吗?它可能使数据库更慢! 再复杂点,对同一字段, 加bitmap index可能快, 加成b-tree就可能更慢.
我觉得什么时候加和如何加应该一起考虑的, 以整体性能的变化为判断依据, 某种方式的索引, 加在某个字段上能够引起整体性能变好时加. 加索引没有绝对化的公式, 有的话数据库就自己替你加了. 加索引是一个尝试-->失败-->再尝试的过程, 直至达到预期的目标(优化前要先定下目标,不过这目标可能永远达不到).DBA完成这一过程所需的时间取决于经验.
加索引的步骤 :
1.提取一条SQL作为关键SQL, 尝试加索引(组)以提升性能
2.提取数条关键SQL作为关键SQL组 , 验证1得到的索引(组)对关键SQL组的性能影响(Plan 变化), 正面进行3, 负面返回1
3.扩展关键SQL到全体SQL, 验证1得到的索引(组)对全体SQL的性能影响(Plan 变化), 正面进行4, 负面返回1
4.纪录该索引(组)和它的性能, 不满意或资源足够返回1, 否则进行5
5.对得到的一批索引(组)进行比较, 选取性能最好的.
1可能永远到不了2或5,这时候要进行调整.
加索引要有索引组的概念, 几个索引之间会互相影响的. |
|