clq
    
    
    
		
        浏览(0) + 
        2008-07-04 13:46:44 发表
        
编辑
         
        
        
        
        关键字: 
        
 
        
        
        
        
                
        [pgsql]复合索引的作用
先看一个讨论 sql server 复合索引的帖子.
--------------------------------------------------
复合索引使用的原则是什么?
楼主fattycat(最爱胖猫)2006-08-13 16:10:51 在 MS-SQL Server / 基础类 提问
  
  我对使用索引的经验较少,想请问大家,使用复合索引的原则是什么?   
    
  如:   
    
  1、复合索引使用的目的是什么?   
    
  2、一个复合索引是否可以代替多个单一索引?   
    
  3、在进行哪些类型的查询时,使用复合索引会比较有效?   
    
  4、符合索引中索引列的排序原则是什么?   
    
  5、什么情况下不适合使用复合索引?   
    
    
  请大家指点!     谢谢啦   
    
  ^o^   
  
问题点数:30、回复次数:5
Top
1 楼liudianhalf(6.30)
回复于 2006-08-13 16:36:42 得分 15
1、复合索引使用的目的是什么?   
  :能形成索引覆盖,提高where语句的查询效率   
    
  2、一个复合索引是否可以代替多个单一索引?   
  :复合索引的使用原则是第一个条件应该是复合索引的第一列,依次类推,否则复合索引不会被使用   
  所以,正常情况下复合索引不能替代多个单一索引   
    
  3、在进行哪些类型的查询时,使用复合索引会比较有效?   
  :如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引,形成索引覆盖可以提高查询的效率   
    
  4、符合索引中索引列的排序原则是什么?   
  :复合索引的使用原则是第一个条件应该是复合索引的第一列,依次类推   
    
  5、什么情况下不适合使用复合索引?   
  :建立索引的目的就是帮助查询,如果查寻用不到则索引就没有必要建立,另外如果数据表过大(5w以上)则有些字段(字符型长度超过(40))不适合作为索引,另外如果表是经常需要更新的也不适合做索引   
  
Top
2 楼mschen(Co-ok)
回复于 2006-08-13 16:39:10 得分 15
根据你的where条件选择符合索引.如果查询是根据多个列,如where   Name='aa'   and   class='bb',那么在Name和Class上建立符合索引会比较好.   
    
  create   index   idx_test   on   表(Name,Class)   
    
  但是符合索引的顺序一定要和查询的顺序相同才有效,如果顺序不同,那就没有效果了.   
    
  是否建立符合索引要根据查询的需要,如果很多查询都是where   Name='aa'   and   class='bb'这样的形式,那建立符合索引就非常好.如果有一部分查询是where   class='cc'   那么你就应该在class上边建立单索引.所以最重要的是根据查询的条件.
--------------------------------------------------
pgsql 也与之类似,不过 pgsql 对 where 条件的顺序是没有先后要求的,它会自动判断.查询中使用索引的情况是可以在 pgAdmin III 的 sql 查询窗口的 "解释" 功能下看到的.如果解释的图示只显示了使用索引的情况那么这个查询的速度是非常快的.
        
        
        
        		
		        
                
                
     
    
 
	
	
     
    
       
    
    clq
    
    
    
    
    
    		    
    
          
              
    	今天发现复合索引一个很牛的问题,在字段上用 = 性能是非常好的,但如果是 >,>=.. 等其他运算符号性能会直线的下降!! 比如下面这句在 1000万级的 pgsql 单表中可以在 50ms 内得到结果,索引字段为 (year, month, day, pb_code) 但一旦将 day=.. 改为 day > .. 第一次访问速度就要到 10 秒(当然多次访问后会有缓存).
SELECT id, mark, jys_code, pb_code, "name", open, high, low, "close", 
       volume, amount, up_count, down_count, "time", "year", "month", 
       "day"
  FROM kline_min
  where year=2008
  and month=7
  and day=7
  and pb_code='00001'
  and mark=2002
  /*and time>1215080700*/
  order by time limit 1000
    
    
     
 
	 
	
    NEWBT官方QQ群1: 276678893
    可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
    但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
    验证问题说明申请入群原因即可.