主键为clientId时,需创建clientId+itemId联合索引还是仅itemId索引?
索引优化建议
针对你的查询场景,应该创建(clientId, itemId)的联合索引,而非单独的itemId索引,具体原因如下:
你的查询条件是
wl.clientId= @clientId(等值匹配) +wl.itemId= ld.itemId(等值关联),联合索引(clientId, itemId)完全匹配这两个等值条件的逻辑顺序:- 先通过
clientId=@clientId快速缩小索引范围,定位到该clientId对应的所有索引条目; - 再在这个范围内通过
itemId精确匹配目标行,全程可直接在索引中完成查找,无需回表查询聚簇索引的数据。
- 先通过
如果仅创建单独的itemId索引,InnoDB的二级索引叶子节点会存储主键clientId的值。查询时需要先通过itemId找到所有对应clientId,再过滤出等于
@clientId的行——若itemId重复度较高,这个过滤过程会遍历大量无关条目,效率远低于联合索引。虽然clientId是主键,但主键索引仅按clientId排序,同一个clientId下的itemId是无序的。当你需要同时匹配clientId和itemId时,主键索引无法利用itemId的条件加速查找,必须遍历该clientId下的所有行才能找到符合itemId条件的数据,性能表现很差。
内容的提问来源于stack exchange,提问作者kosnkov
相关产品推荐
相关产品推荐

