mysql一个复合索引能满足使用连接的查询吗?

4urapxun  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(708)

据我所知,在这样的情况下,综合指数将完成所需的工作:

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

索引应该是(id\u city,id\u type)。只要所有查询总是过滤这两个组合字段,就不需要其他索引。
但是查询中的一个字段在join语句中使用,而另一个字段在where语句中使用呢?例子:

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

在friends表中,(id\u user,id\u str)索引是否足够(顺便说一句,我不是在问用户表,那当然是另一种情况)。
电流选择说明:

qxgroojn

qxgroojn1#

对于你最初的询问,是的, (id_city, id_type) 任何一种顺序都是最优的。钉住 name 最后一个会稍微好一点(因为是“覆盖”)。
继续。。。
对于该特定查询,请使用以下索引:

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

事情是这样的:
优化器看到 JOIN 还有一些关于其中一张table的东西( friends )在 WHERE ,所以它决定从 friend .
处理 WHERE ,它需要一个以 WHERE ,即 id_str .
因为没有太多的其他需要 friend ,让我们把所有的列都放在索引中,因此“covering”。 EXPLAIN 会通过说 Using index .
现在,去另一张table( user ). 这个 ON 条款需求 id_str ,所以先把它放在索引中。
再次,让我们通过添加 name .
我在这里更笼统地讨论了这件事。
如果您真正的查询在任何方面看起来都不一样,那么所有的赌注都没有了。也就是说,我建议的指数可能是有益的,也可能不是有益的。
如果您想进一步讨论,请提供 SHOW CREATE TABLE 真正的疑问。

相关问题