为什么mysql每个表只使用一个索引?

时间:2015-04-17 19:30:19

标签: mysql indexing explain

我在查询上运行解释,我得到了这些结果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY bussiness   index   PRIMARY,closeBussStatus,bussStatus,approveStatus,cityID,presaleID,nameEn,DUNS,xy,subCategoryID  PRIMARY 4   NULL    295794  Using where; Using temporary; Using filesort
1   PRIMARY favourites  ref userID,bussID,userId_bussId bussID  4   haanet.bussiness.bussID 1   Using where
3   DEPENDENT SUBQUERY  rating  ref bussId  bussId  4   func    1   NULL
2   DEPENDENT SUBQUERY  rating  ref bussId  bussId  4   func    1   Using index

这表明第一个表有很多possible_keys,但它只选择一个索引。为什么MySQL没有为每个表使用多个索引?

1 个答案:

答案 0 :(得分:1)

(我回答主题;似乎大部分细节都已消失。)

为什么只使用一个索引?这样想吧。假设您有一百万人的目录。实际上你有两个副本,一个按名字排序,一个按姓氏排序。在一个列表中,您可以找到具有名字' Rick'以及唯一标识号的数千个(或左右)条目。在另一个列表中,您会找到一千个姓氏' James'以及ID。既然你在寻找我,你必须以某种方式将这两个子列表放在一起,为我找到一个id。 (还有Superfreak的另一个id。)它很乱,它涉及两个临时表,可能还有一些等等。

优化器认为通过一个列表更简单,检查WHERE子句的其余部分。

但实际上(在这种情况下),"化合物"指数会更好。也就是说,有一个包含一百万个名字的列表,按姓氏和名字的组合排序:INDEX(last_name, first_name)。有了这个,我很容易找到。

实际上,优化器有时会执行我先描述的操作。它称之为"索引合并交集"。 I discuss all these topics in a blog