索引和全表的开销权衡问题

索引和全表的开销权衡问题:选择率、数据量大小,及索引类型、索引的dml带来的开销 。

1、如何理解选择率?

索引的选择率就是块选择率,选择率的问题不单纯是指行的选择率,如何选择使用索引,可以从块的比例来看,where条件中选择的块占数据库整个块数量的比例越小越好,所以我们说块选择率越小越好,这样索引列所在的数据就比较集中,可减小物理I/O,这时我们就认为这一列适合建索引。
 2、如何理解索引的dml带来的开销?

dml对索引的开销,对insert来说,比如一个表中有一列是usernumber(手机号码),另一列是inserttime(插入时间),usernumber插入的时候手机号码会被随机的分配到各个块上,是不连续的插入,当维护索引时,开销就会很大(主要是I/O)。insettime插入时间,插入的时候是连续的,当维护索引时,开销会小点。在同级的数据量情况下比索引如insertime类型的开销要大,因为usernumber的索引是无规则的,而inserttime是有序的,无规则索引的插入会造成大量的io开销。同类型数据量越大维护索引的开销就越大,数据量越小维护索引的开销就越小。
3、 update是否一定带来索引的维护开销?

不一定,当update相应索引列时会带来维护开销,如果不是update索引列,不会带来索引维护开销;如果表中有索引,insert是一定会带来索引维护开销的。

4、如果一个表中modifytime(修改时间)索引列经常被dml,那么当我查询modifytime >= sysdate and modifytime <sysdate+1 时走索引有优势吗?

这时走全表更有优势,modiytime这一列是修改时间,修改时间是会变的,比如一个数据是100天前修改的,今天修改后,修改时间就变成今天了,这个索引列里有很多这样的情况,也就是说索引列的数据分布是没有规律的是离散的,当查询的数据是无规则的(查询时需从各个分散的块找数据,这时I/O就会很大),对查询这样的索引列时,走全表更快。如果走索引,每读一次索引,然后根据rowid找到相应的行,再读另外一个索引,再读行,这样重复操作就会操作很多io,索引是单块读,每读一次会增加一次Io,如果全表的话就是多块读,io较少,多块读一次最多可读128个块。

5、相对较小的表应避免使用索引

6、为所有表创建主键

7、对包括在多表联结操作中的列建立索引

8、对在WHERE子句中频繁使用的列建立索引

9、对包括在ORDER BY和GROUP BY操作或涉及排序的DISTINCT等其它操作中的列建立索引

10、由长字符串组成的列通常不是索引的候选列

11、被频繁更改的列由于涉及开销问题,理论上不应该被索引

12、保持索引数目尽量少

14、当单一列值都不唯一时需要使用组合索引

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值