单一索引和复合索引区别及联系 - BABY的日志 - 网易博客  http://selectgoodboy.blog.163.com/blog/static/1032120612015191117118/

什么是单一索引,什么又是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要是对网上一些讨论的总结。

一.概念
单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。
用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。复合索引的创建方法与创建单一索引的方法完全一样。但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度。
同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为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   col2=A   and   col3=B   and   col5=D  
如果是"select   *   from   table1   where   col3=B   and   col2=A   and   col5=D"
或者是"select   *   from   table1   where   col3=B"将不会使用索引,或者效果不明显
3.复合索引会替代单一索引么?
很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)
IDX1:create   index   idx1   on   Tgongwen(fariqi,neibuyonghu)  
(1)select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi>'2004-5-5'
查询速度:2513毫秒
(2)select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi>'2004-5-5' and neibuyonghu='办公室'
查询速度:2516毫秒
(3)select gid,fariqi,neibuyonghu,title from Tgongwen
where 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   col1=A     使用idx1  
  执行select   *   from   table1   where   col1=A   and   col2=B   也使用idx1  
(2)删除索引idx1,然后建立idx2   on   (col1,col2)复合索引  
  执行以上两个查询,也都使用idx2  
(3)如果两个索引idx1,idx2都存在  
  并不是   where   col1='A'用idx1;where   col1=A   and   col2=B  用idx2。  
  其查询优化器使用其中一个以前常用索引。要么都用idx1,要么都用idx2.  
   
由此可见,
(1)对一张表来说,如果有一个复合索引 on   (col1,col2),就没有必要同时建立一个单索引 on col1。
(2)如果查询条件需要,可以在已有单索引 on col1的情况下,添加复合索引on   (col1,col2),对于效率有一定的提高。
(3)同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。
5. 一定需要覆盖性查询么?
通常最好不要采用一个强调完全覆盖查询的策略。如果Select子句中的所有列都被一个非群集索引覆盖,优化程序会识别出这一点,并提供很好的性能。不过,这通常会导致索引过宽,并会过度依赖于优化程序使用该策略的可能性。通常,是用数量更多的窄索引,这对于大量查询来说可以提供更好的性能。

单一索引和复合索引区别及联系相关推荐

  1. 单一索引和复合索引区别

    单一索引和复合索引区别及联系 - BABY的日志 - 网易博客  http://selectgoodboy.blog.163.com/blog/static/103212061201519111711 ...

  2. 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系

    B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一.索引的数据结构可以是树,也可以是哈希表.常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提.本文旨在梳理 ...

  3. 【MySQL 优化】单一索引与复合索引

    MySQL 单一索引与复合索引 前 言 一.索引的最左前缀匹配原则 二.使用使用联合索引优势 1. 减少开销 2. 覆盖索引 3. 效率高 前 言 单一索引是指索引列为一列的情况,即新建索引的语句只实 ...

  4. php复合索引,关于复合索引和单独索引的一个问题

    复合索引 1,shopid ctime EXPLAIN SELECT COUNT(*) FROM dc_order_menu_log WHERE shopid = 12 AND ctime > ...

  5. oracle 复合索引原则,复合索引在什么情况下使用

    http://topic.csdn.net/t/20060813/16/4946416.html 1.复合索引使用的目的是什么? :能形成索引覆盖,提高where语句的查询效率 2.一个复合索引是否可 ...

  6. Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面

    Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录

  7. Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、

    Pandas把dataframe的索引.复合索引变换为数据列:包含单索引到单列(重命名).复合索引到多数据列.复合索引的其中一个水平变换为数据列 目录

  8. is NULL , is NOT NULL 有时索引失效 || in 走索引, not in 索引失效 ||单列索引和复合索引 || 查看索引使用情况

    is NULL , is NOT NULL 有时索引失效 in 走索引, not in 索引失效 单列索引和复合索引 尽量使用复合索引,而少使用单列索引 数据库会选择一个最优的索引(辨识度最高索引)来 ...

  9. MySQL单列索引与复合索引选择

    单列索引和复合索引. 尽量使用复合索引,而少使用单列索引 . 创建复合索引 create index idx_name_sta_address on tb_seller(name, status, a ...

最新文章

  1. Java项目:控制台商城系统(java+打印控制台)
  2. git 代码托管使用方法
  3. 4.1 MyEclipse中搭建Struts2开发环境
  4. 夺命雷公狗---ECSHOP---08---商品页的拇改成星星
  5. leetcode421. 数组中两个数的最大异或值(贪心算法)
  6. Unity3D下Linux平台播放RTSP或RTMP流
  7. 中秋快乐:数据库的全家福指尖细数识几何?
  8. 哪些事情瞬间暴露了你的贫穷?
  9. Linux下让Eclipse支持Python
  10. [Java] 蓝桥杯ALGO-98 算法训练 数位分离
  11. leetcode—22.二分查找题目leetcode总结
  12. equals方法的小结
  13. Hadoop和Hbase版本选择
  14. python单例模式学习
  15. 小米手机多功能计算机都怎么使用方法,图文展示小米手机如何连接电脑详细操作...
  16. 提交健康信息服务器拥挤,python hpilo 监控 hp ilo 服务器健康信息
  17. 一个好用的 txt 小说阅读器(自用好用,目前没发现替代款)
  18. CAN位时序及相关参数解读
  19. fread函数 和 feof函数
  20. 德州仪器宣布收购12寸晶圆厂

热门文章

  1. 变异系数法之matlab
  2. cad和python哪个好学_对纯外行人来说,学习PS和Python哪个更容易?
  3. python datetime
  4. linux进程号为一,一步步探究linux进程中的用户ID
  5. kex_exchange_identification: Connection closed by remote host Connection closed by 140.82.121.3 port
  6. mysql使用navicat(建表前与建表后)添加时间戳(创建时间、自动更新时间)
  7. day1-参数化关联函数响应断言
  8. openresty总结
  9. 系统启动 之 Linux系统启动概述(2)
  10. 再读王永庆卖米的故事