数据库什么时候加索引

什么时候加索引,   如何加?    
  最经典的说法:   数据库慢了,   加索引.   加索引就快了吗?它可能使数据库更慢!   再复杂点,对同一字段,   加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,这时候要进行调整.    
   
  加索引要有索引组的概念,   几个索引之间会互相影响的.   
    
    
    
  简单开个头    
  建立索引(BTree)首要条件,表记录不能太小(尤其是没有join的表):    
  1:记录的选择性比较高(不同值不是太少)    
  2:做表连接的字段    
  3:经常位于where条件中的字段    
  ……    
  关于索引可能带来不良影响:    
  在对大表进行较多记录的范围查询的时候    
  3个因素会影响数据缓冲区:    
  (关于2,我实在忘了出处了,sorry。大家可探讨。这关系到缓冲区数据块高低端和级别问题)    
   
  1:通过ROWID(索引)读出来的数据,将会挂在数据缓冲区高端,也就是将比较长的时间保持于数据缓冲区,如果重复利用机会小,则将可能造成性能问题    
  2:由于数据缓冲区的数据替换策略并不是严格的将整个对象替换出去    
  在压力比较大的情况下,它采取的是压缩各对象数据,换句话说,很可能存在这么一种情况,由于某个对象数据的进入,假设同时换出了5个对象的10%的数据,而以后正好又查询需要用这5个对象的被换出部分数据,则……    
  3:   索引本身也会占用sga,当索引大到一定程度的时候也需要考虑这个问题    
   
  当然,oracle采取这种策略也是有它的道理的    
  上面说的这些情况,毕竟不是常见的,只是一种可能  

你可能感兴趣的:(数据库什么时候加索引)