我应该创建什么类型的索引?

时间:2015-12-31 10:44:14

标签: sql sql-server sql-server-2008 sql-server-2005

表有6列。 column1是唯一的,因此我在 create primary key for column1 create index for col2, col3, col4, col5, col6, col1 上创建了主键,并为所有列创建了非聚集索引:

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

 static NSString *defaultPinID = @"Annotation";
    pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
    if ( pinView == nil )
       pinView = [[MKAnnotationView alloc]
                  initWithAnnotation:annotation reuseIdentifier:defaultPinID];

    UIImage *originalImage = [UIImage imageNamed:@"map.png"];
    pinView.canShowCallout = YES;
    pinView.image = [self drawImage:originalImage inRect:CGRectMake(0, 0, 106, 148)];
    pinView.calloutOffset = CGPointMake(0, -5);

    UIImageView *profileImageView = [[UIImageView alloc]init];
    profileImageView.frame = CGRectMake(6, 7, 40, 40);
    [profileImageView setImage:[UIImage imageNamed:@"user.png"]];
    [profileImageView setBackgroundColor:[UIColor whiteColor]];
    [self setRoundedAvatar:profileImageView toDiameter:40 atView:self.view];
    [pinView addSubview:profileImageView];

所以我在where子句中的任何列都将使用除column1之外的索引,之后它会错过主键中的column1并将整合两个结果。因为这会提高性能吗?

2 个答案:

答案 0 :(得分:3)

如果正在使用该索引中的 n个最左列,那么从多列构成的复合索引只能 在where子句中。

因此,如果您在(col1, col2, col3, col4)上有索引,那么可能会使用

  • 当您的查询在所有四列上都有WHERE条件时
  • 当您的查询在WHEREcol1col2
  • 上有col3个条件时
  • 当您的查询在WHEREcol1
  • 上有col2条件时
  • 当您的查询在WHERE
  • 上有col1条件时

但如果您的查询中包含例如条件的情况,那么 CAN NOT 就无法帮助您col3, col4(因为那些索引中最左边的2列)

所以在你的情况下,你需要一个带

的索引
  • col1, col2
  • col3, col4
  • col1, col4

没有单一的索引可以满足这些需求 - 例如有col1, col2, col4的索引,可能会用于查询#1,但不能真正用于查询#3(或仅用于处理col1开始 - 但它不会对col4提供帮助。

因此,在您的情况下,唯一的选择是使用三个单独的索引 - 每种类型的查询一个 - 并查看这些索引是否真的有助于加快查询速度。然而,这也意味着只要表获得插入,更新或删除操作,就需要更新和维护三个索引。尝试并测量,然后确定速度增加是否保证插入,更新和删除操作可能产生的额外开销。

答案 1 :(得分:0)

如果您只优化那些查询而不关心索引的大小,那么就像那样 - (col1, col2)(col3, col4)和{{1} }。请注意,此处列的顺序并不重要。

但是如果您有大量数据,或者您经常修改数据(插入,更新密钥或删除),那么您也应该将其纳入帐户。索引的重新安排也需要时间,列越多,重新安排的次数越多(sql server的选项越少)。索引也占用空间,因此如果您拥有大数据(和限制版或磁盘),那么您可能还需要优化空间。

然后,您可以选择权衡解决方案,只创建两个索引(col1, col4)(col1),这些索引将部分涵盖所有三个查询。这一切都取决于(col4)col1的选择性以及您调用查询的频率以及您需要它们的速度。

要了解基础知识,请参阅best guide索引。