据我所知,在这样的情况下,复合索引将完成所需的工作:
SELECT name FROM user WHERE id_city = 3 AND id_type = 5
索引将是(id_city,id_type)。只要所有查询总是过滤这两个组合字段,就不再需要其他索引。
但是,如果查询中的一个字段在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) 索引在friends表中是否足够?(顺便说一句,我不是在问用户表,这当然是另一种情况)。
解释当前SELECT:
发布于 2018-06-17 03:45:03
对于您的初始查询,是的,任何顺序的(id_city, id_type)
都是最佳的。最后添加name
会稍微好一些(因为是“覆盖”)。
继续..。
对于该特定查询,使用以下索引:
friend: (id_user, id_str) -- in this order; "covering"
user: (id_str, name) -- in this order; "covering"
下面是正在发生的事情:
优化器在WHERE
中看到了JOIN
和一些关于其中一个表(friends
)的东西,所以它决定从friend
.
WHERE
,它需要一个从WHERE
中的内容开始的索引,也就是说friend
不需要太多其他东西,让我们把所有的列都放在索引中,因此“
EXPLAIN
将通过说Using index
.
user
)来表明这一点。ON
子句需要id_str
,所以先把它放在index.
name
.来玩这个掩护游戏
我更一般地用来介绍这些东西。
如果您的实际查询看起来有任何不同之处,那么所有的赌注都是错误的。也就是说,我建议的索引可能是有益的,也可能是无益的。
如果您想进一步讨论,请提供
SHOW CREATE TABLE
https://stackoverflow.com/questions/50849345
复制相似问题