asp网站建设实录,创立制作网站公司,网站开发登录链接,在阿里巴巴网站上怎么做贸易概要什么是单一索引,什么又是复合索引呢? 何时新建复合索引#xff0c;复合索引又需要注意些什么呢#xff1f;本篇文章主要是对网上一些讨论的总结。一.概念单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以在多个列上建立索引#xff0c;这种索… 概要什么是单一索引,什么又是复合索引呢? 何时新建复合索引复合索引又需要注意些什么呢本篇文章主要是对网上一些讨论的总结。一.概念单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以在多个列上建立索引这种索引叫做复合索引(组合索引)。复合索引的创建方法与创建单一索引的方法完全一样。但复合索引在数据库操作期间所需的开销更小可以代替多个单一索引。当表的行数远远大于索引键的数目时使用这种方式可以明显加快表的查询速度。同时有两个概念叫做窄索引和宽索引窄索引是指索引列为1-2列的索引,如果不特殊说明的话一般是指单一索引。宽索引也就是索引列超过2列的索引。设计索引的一个重要原则就是能用窄索引不用宽索引因为窄索引往往比组合索引更有效。拥有更多的窄索引将给优化程序提供更多的选择余地这通常有助于提高性能。二.使用创建索引 create index idx1 on table1(col1,col2,col3) 查询select * from table1 where col1 A and col2 B and col3 C这时候查询优化器不在扫描表了而是直接的从索引中拿数据因为索引中有这些数据这叫覆盖式查询这样的查询速度非常快。 三.注意事项1.何时是用复合索引在where条件中字段用索引如果用多字段就用复合索引。一般在select的字段不要建什么索引(如果是要查询select col1 ,col2, col3 from mytable,就不需要上面的索引了)。根据where条件建索引是极其重要的一个原则。注意不要过多用索引否则对表更新的效率有很大的影响因为在操作表的时候要化大量时间花在创建索引中.2.对于复合索引在查询使用时最好将条件顺序按找索引的顺序这样效率最高。如 IDX1:create index idx1 on table1(col2,col3,col5) select * from table1 where col2A and col3B and col5D 如果是select * from table1 where col3B and col2A and col5D或者是select * from table1 where col3B将不会使用索引或者效果不明显3.复合索引会替代单一索引么?很多人认为只要把任何字段加进聚集索引就能提高查询速度也有人感到迷惑如果把复合的聚集索引字段分开查询那么查询速度会减慢吗带着这个问题我们来看一下以下的查询速度结果集都是25万条数据日期列fariqi首先排在复合聚集索引的起始列用户名neibuyonghu排在后列IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu) 1select gid,fariqi,neibuyonghu,title from Tgongwenwhere fariqi2004-5-5查询速度2513毫秒2select gid,fariqi,neibuyonghu,title from Tgongwenwhere fariqi2004-5-5 and neibuyonghu办公室查询速度2516毫秒3select gid,fariqi,neibuyonghu,title from Tgongwenwhere neibuyonghu办公室查询速度60280毫秒从以上试验中我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的甚至比用上全部的复合索引列还要略快在查询结果集数目一样的情况下而如果仅用复合聚集索引的非起始列作为查询条件的话这个索引是不起任何作用的。当然语句1、2的查询速度一样是因为查询的条目数一样如果复合索引的所有列都用上而且查询结果少的话这样就会形成“索引覆盖”因而性能可以达到最优。同时请记住无论您是否经常使用聚合索引的其他列但其前导列一定要是使用最频繁的列。[参考: 查询优化及分页算法方案 http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]4.需要在同一列上同时建单一索引和复合索引么?试验: sysbase 5.0 表table1 字段col1,col2,col3 试验步骤 1建立索引idx1 on col1 执行select * from table1 where col1A 使用idx1 执行select * from table1 where col1A and col2B 也使用idx1 2删除索引idx1,然后建立idx2 on (col1,col2)复合索引 执行以上两个查询也都使用idx2 3如果两个索引idx1,idx2都存在 并不是 where col1A用idx1where col1A and col2B 用idx2。 其查询优化器使用其中一个以前常用索引。要么都用idx1,要么都用idx2. 由此可见1对一张表来说如果有一个复合索引 on (col1,col2)就没有必要同时建立一个单索引 on col1。2如果查询条件需要可以在已有单索引 on col1的情况下添加复合索引on (col1,col2)对于效率有一定的提高。3同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处相对而言建立多个窄字段(仅包含一个或顶多2个字段)的索引可以达到更好的效率和灵活性。5. 一定需要覆盖性查询么通常最好不要采用一个强调完全覆盖查询的策略。如果Select子句中的所有列都被一个非群集索引覆盖优化程序会识别出这一点并提供很好的性能。不过这通常会导致索引过宽并会过度依赖于优化程序使用该策略的可能性。通常是用数量更多的窄索引这对于大量查询来说可以提供更好的性能。 转载于:https://www.cnblogs.com/firstdream/p/7241368.html