我在查询上运行解释,我得到了这些结果:
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没有为每个表使用多个索引?
答案 0 :(得分:1)
(我回答主题;似乎大部分细节都已消失。)
为什么只使用一个索引?这样想吧。假设您有一百万人的目录。实际上你有两个副本,一个按名字排序,一个按姓氏排序。在一个列表中,您可以找到具有名字' Rick'以及唯一标识号的数千个(或左右)条目。在另一个列表中,您会找到一千个姓氏' James'以及ID。既然你在寻找我,你必须以某种方式将这两个子列表放在一起,为我找到一个id。 (还有Superfreak的另一个id。)它很乱,它涉及两个临时表,可能还有一些等等。
优化器认为通过一个列表更简单,检查WHERE子句的其余部分。
但实际上(在这种情况下),"化合物"指数会更好。也就是说,有一个包含一百万个名字的列表,按姓氏和名字的组合排序:INDEX(last_name, first_name)
。有了这个,我很容易找到。
实际上,优化器有时会执行我先描述的操作。它称之为"索引合并交集"。 I discuss all these topics in a blog