5、相对较小的表应避免使用索引
6、为所有表创建主键
7、对包括在多表联结操作中的列建立索引
8、对在WHERE子句中频繁使用的列建立索引
9、对包括在ORDER BY和GROUP BY操作或涉及排序的DISTINCT等其它操作中的列建立索引
10、由长字符串组成的列通常不是索引的候选列
11、被频繁更改的列由于涉及开销问题,理论上不应该被索引
12、保持索引数目尽量少
14、当单一列值都不唯一时需要使用组合索引
索引和全表的开销权衡问题:选择率、数据量大小,及索引类型、索引的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、当单一列值都不唯一时需要使用组合索引