欢迎来到天天文库
浏览记录
ID:53668720
大小:94.50 KB
页数:7页
时间:2020-04-05
《数据库中的索引技术.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、数据库中的索引技术索引的设计目标:为了提升数据库的性能.索引建立的规则:在经常进行连接,但是没冇指定为外键的列上建立索引,而不经常连接的字段则山优化器IH动生成索引。在频繁进行扌II:序或分组(即进行groupby或orderby操作)的列上建立索引。在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只右“男”与"女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严巫降低更新速度。如果待按序的列冇多个,可以在这些列上建立复合索引2、index)0使用索引应注意的爭项:(1)在下面两条select语句中:select*fromtablelwherefieldl<=10000andfieldl>=0;select*fromtablelwherefieldl>=0andfieldl<=10000;如果数据表中的数据fieldl都〉二0,则第一条select语彳U要比第二条select语何效率高的多,因为第二条select语句的第一个条件耗费了大量的系统资源。第一个原则:在where子句中应把最具限制性的条件放在最前面。(2)在下面的select语句中:selec3、t*fromtabwherea=••-andb二…andc二…;若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序一致。第二个原则:where子旬中字段的顺序应和索引中字段顺序一致。以下假设在fieldl上有唯一索引II,在field2上有非唯一索引12。(3)selectfield3,field4fromtbwherefieldl=,self*快select*fromtbwherefieldl二'sdf'慢,因为后者在索引扫描后要多一步ROW【I)表访问。(4)selectfield3,field4、4fromtbwherefieldl>=,self5快selectfield3,field4fromtbwherefieldl〉'sdf'慢因为前者可以迅速定位索引。(1)selectfield3,field4fromtbwherefield2like'R%'快selectfield3,field4fromtbwherefield2like'%R'慢,因为后者■不使用索引。(2)使用函数如:selectfield3,field4fromtbwhereupper(field2)=RMNJ不使用索引。如果一个表冇两万条记录,建议不使5、用函数;如果一个表有五力条以上记录,严格禁止使用函数!两万条记录以下没有限制。(3)空值不在索引中存储,所以selectfield3,field4fromtbwheret*ie1(12is[not]null不使用索引。(4)不等式如selectfield3,field4fromtbwherefield?!=,TOM*不使用索引。相似地,selectfield3,field4fromtbwherefield2notin('M','P')不使用索引。(5)多列索引,只冇当査询中索引首列被用于条件时,索引才能被使用。(6)MAX,MI6、N等函数,如Selectmax(fiel(12)fromtb使用索引。所以,如果需要对字段取max,min,sum等,应该加索引。一次只使用一个聚集函数,如:select“min”=min(fieldl),“max”=max(fieldl)fromtb不如:select“min"二(selectinin(fieldl)fromtb),“max"=(selectmax(fieldl)fromtb)(7)重复值过多的索引不会被查询优化器使用。而且因为建了索引,修改该字段值时还要修改索引,所以更新该字段的操作比没有索引更慢。(8)索引7、值过大(如在一个char(40)的字段上建索引),会造成大量的I/O开销(甚至会超过表扫描的I/O开销)。因此,尽量使用整数索引。Sp_estspace可以计算表和索引的开销。(9)对于多列索引,orderby的顺序必须和索引的字段顺序一致。(10)在Sybase中,如果orderby的字段组成一个簇索引,那么无须做orderby®记录的排列顺序是与簇索引一致的。(11)多表联结(具体査询方案需要通过测试得到)where子句中限定条件尽量使用相关联的字段,忖尽量把相关联的字段放在前面。selecta.fieldl,b.field8、2froma,bwherea.field3=b.field31.field3±没有索引的情况下:对8作全表扫描,结果排序对1)作全表扫描,结果排序结果合并。对于很小的表或巨大的表比较合适。1.field3±有索引按照表联结的次序,b为驱动表,“为被驱动表对b作全
2、index)0使用索引应注意的爭项:(1)在下面两条select语句中:select*fromtablelwherefieldl<=10000andfieldl>=0;select*fromtablelwherefieldl>=0andfieldl<=10000;如果数据表中的数据fieldl都〉二0,则第一条select语彳U要比第二条select语何效率高的多,因为第二条select语句的第一个条件耗费了大量的系统资源。第一个原则:在where子句中应把最具限制性的条件放在最前面。(2)在下面的select语句中:selec
3、t*fromtabwherea=••-andb二…andc二…;若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序一致。第二个原则:where子旬中字段的顺序应和索引中字段顺序一致。以下假设在fieldl上有唯一索引II,在field2上有非唯一索引12。(3)selectfield3,field4fromtbwherefieldl=,self*快select*fromtbwherefieldl二'sdf'慢,因为后者在索引扫描后要多一步ROW【I)表访问。(4)selectfield3,field
4、4fromtbwherefieldl>=,self5快selectfield3,field4fromtbwherefieldl〉'sdf'慢因为前者可以迅速定位索引。(1)selectfield3,field4fromtbwherefield2like'R%'快selectfield3,field4fromtbwherefield2like'%R'慢,因为后者■不使用索引。(2)使用函数如:selectfield3,field4fromtbwhereupper(field2)=RMNJ不使用索引。如果一个表冇两万条记录,建议不使
5、用函数;如果一个表有五力条以上记录,严格禁止使用函数!两万条记录以下没有限制。(3)空值不在索引中存储,所以selectfield3,field4fromtbwheret*ie1(12is[not]null不使用索引。(4)不等式如selectfield3,field4fromtbwherefield?!=,TOM*不使用索引。相似地,selectfield3,field4fromtbwherefield2notin('M','P')不使用索引。(5)多列索引,只冇当査询中索引首列被用于条件时,索引才能被使用。(6)MAX,MI
6、N等函数,如Selectmax(fiel(12)fromtb使用索引。所以,如果需要对字段取max,min,sum等,应该加索引。一次只使用一个聚集函数,如:select“min”=min(fieldl),“max”=max(fieldl)fromtb不如:select“min"二(selectinin(fieldl)fromtb),“max"=(selectmax(fieldl)fromtb)(7)重复值过多的索引不会被查询优化器使用。而且因为建了索引,修改该字段值时还要修改索引,所以更新该字段的操作比没有索引更慢。(8)索引
7、值过大(如在一个char(40)的字段上建索引),会造成大量的I/O开销(甚至会超过表扫描的I/O开销)。因此,尽量使用整数索引。Sp_estspace可以计算表和索引的开销。(9)对于多列索引,orderby的顺序必须和索引的字段顺序一致。(10)在Sybase中,如果orderby的字段组成一个簇索引,那么无须做orderby®记录的排列顺序是与簇索引一致的。(11)多表联结(具体査询方案需要通过测试得到)where子句中限定条件尽量使用相关联的字段,忖尽量把相关联的字段放在前面。selecta.fieldl,b.field
8、2froma,bwherea.field3=b.field31.field3±没有索引的情况下:对8作全表扫描,结果排序对1)作全表扫描,结果排序结果合并。对于很小的表或巨大的表比较合适。1.field3±有索引按照表联结的次序,b为驱动表,“为被驱动表对b作全
此文档下载收益归作者所有