表有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并将整合两个结果。因为这会提高性能吗?
答案 0 :(得分:3)
如果正在使用该索引中的 n个最左列,那么从多列构成的复合索引只能 在where子句中。
因此,如果您在(col1, col2, col3, col4)
上有索引,那么可能会使用
WHERE
条件时WHERE
,col1
,col2
col3
个条件时
WHERE
,col1
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索引。