据我所知,在这样的情况下,综合指数将完成所需的工作:
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)索引是否足够(顺便说一句,我不是在问用户表,那当然是另一种情况)。
电流选择说明:
1条答案
按热度按时间qxgroojn1#
对于你最初的询问,是的,
(id_city, id_type)
任何一种顺序都是最优的。钉住name
最后一个会稍微好一点(因为是“覆盖”)。继续。。。
对于该特定查询,请使用以下索引:
事情是这样的:
优化器看到
JOIN
还有一些关于其中一张table的东西(friends
)在WHERE
,所以它决定从friend
.处理
WHERE
,它需要一个以WHERE
,即id_str
.因为没有太多的其他需要
friend
,让我们把所有的列都放在索引中,因此“covering”。EXPLAIN
会通过说Using index
.现在,去另一张table(
user
). 这个ON
条款需求id_str
,所以先把它放在索引中。再次,让我们通过添加
name
.我在这里更笼统地讨论了这件事。
如果您真正的查询在任何方面看起来都不一样,那么所有的赌注都没有了。也就是说,我建议的指数可能是有益的,也可能不是有益的。
如果您想进一步讨论,请提供
SHOW CREATE TABLE
真正的疑问。