资源描述:
《数据库中的索引技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、数据库中的索引技术索引的设计目标:为了提升数据库的性能.索引建立的规则:在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 在频繁进行排序或分组(即进行groupby或orderby操作)的列上建立索引。 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 如果待排序的列有多个,可以在这些列上建立复合索引(compoundindex)。使用
2、索引应注意的事项:(1)在下面两条select语句中: select*fromtable1 where field1<=10000andfield1>=0; select*fromtable1 where field1>=0andfield1<=10000; 如果数据表中的数据field1都>=0,则第一条select语句要比第二条select语句效率高的多,因为第二条select语句的第一个条件耗费了大量的系统资源。 第一个原则:在where子句中应把最具限制性的条件放在最前面。(2)在下面的select语句中: select*fromt
3、ab where a=…andb=…andc=…; 若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序一致。 第二个原则:where子句中字段的顺序应和索引中字段顺序一致。以下假设在field1上有唯一索引I1,在field2上有非唯一索引I2。(3)selectfield3,field4fromtbwherefield1='sdf' 快 select*fromtbwherefield1='sdf' 慢,因为后者在索引扫描后要多一步ROWID表访问。(4)selectfield3,field4fromtbw
4、herefield1>='sdf' 快selectfield3,field4fromtbwherefield1>'sdf' 慢因为前者可以迅速定位索引。(5)selectfield3,field4fromtbwherefield2like'R%' 快 selectfield3,field4fromtbwherefield2like'%R' 慢, 因为后者不使用索引。(6)使用函数如:selectfield3,field4fromtbwhereupper(field2)='RMN'不使用索引。如果一个表有两万条记录,建议不使用函数;
5、如果一个表有五万条以上记录,严格禁止使用函数!两万条记录以下没有限制。(7)空值不在索引中存储,所以 selectfield3,field4fromtbwherefield2is[not]null不使用索引。(8)不等式如 selectfield3,field4fromtbwherefield2!='TOM'不使用索引。 相似地, selectfield3,field4fromtbwherefield2notin('M','P')不使用索引。(9)多列索引,只有当查询中索引首列被用于条件时,索引才能被使用。(10) MAX,MIN等函数,如S
6、electmax(field2)fromtb使用索引。所以,如果需要对字段取max,min,sum等,应该加索引。一次只使用一个聚集函数,如:select“min”=min(field1),“max”=max(field1) fromtb 不如:select“min”=(selectmin(field1)fromtb),“max”=(selectmax(field1)fromtb) (11)重复值过多的索引不会被查询优化器使用。而且因为建了索引,修改该字段值时还要修改索引,所以更新该字段的操作比没有索引更慢。(12)索引值过大(如在一个char
7、(40)的字段上建索引),会造成大量的I/O开销(甚至会超过表扫描的I/O开销)。因此,尽量使用整数索引。Sp_estspace可以计算表和索引的开销。(13)对于多列索引,orderby的顺序必须和索引的字段顺序一致。(14)在sybase中,如果orderby的字段组成一个簇索引,那么无须做orderby。记录的排列顺序是与簇索引一致的。(15)多表联结(具体查询方案需要通过测试得到) where子句中限定条件尽量使用相关联的字段,且尽量把相关联的字段放在前面。 selecta.field1,b.field2froma,bwherea.fie
8、ld3=b.field3 1.field3上没有索引的情况下: 对a作全表扫描,结果排序 对b作全表扫描