MySQL 复合索引是否足以满足使用 JOIN 的查询?

MySQL will a composite index suffice a query that uses a JOIN?

据我了解,复合索引将完成在这种情况下所需的功能:

SELECT name FROM user WHERE id_city = 3 AND id_type = 5

INDEX 将是 (id_city, id_type)。只要所有查询始终过滤这 2 个组合字段,就不需要其他索引。

但是对于其中一个字段用于 JOIN 语句而另一个字段用于 WHERE 语句的查询呢?示例:

SELECT user.name AS name
FROM user JOIN friend ON friends.id_str = user.id_str
WHERE friends.id_user = 3

(id_user, id_str) INDEXfriends [=37= 中是否足够]? (顺便说一句,我不是在问 user table,那当然是另一种情况。

当前的解释 SELECT:

对于您的初始查询,是的,(id_city, id_type) 任一顺序 都是最佳的。在 name last 上添加会稍微好一些(因为是 "covering")。

继续前进...

对于那个具体查询,有这些索引:

friend:   (id_user, id_str)  -- in this order; "covering"
user:     (id_str, name)     -- in this order; "covering"

这是正在发生的事情:

  1. 优化器在 WHERE 中看到 JOIN 和一些关于 table 之一 (friends) 的东西,因此它决定从 [=16] 开始=].
  2. 要处理 WHERE,它需要一个索引 starting WHERE,即 id_str.
  3. 由于 friend 不需要太多其他内容,让我们将所有列放入索引中,因此 "covering"。 EXPLAIN 将通过说 Using index 来表示。
  4. 现在,去另一个 table (user)。 ON子句需要id_str,所以把它放在索引的第一个
  5. 再次,让我们通过添加name来玩掩护游戏。

我更笼统地介绍了这些内容 here .

如果您的真实 查询在任何方面看起来都不一样,那么所有的赌注都会被取消。也就是说,我建议的索引可能 也可能不会 有益。

如需进一步讨论,请提供

  • SHOW CREATE TABLE
  • 真实查询。