首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL复合索引是否能满足使用连接的查询?

MySQL复合索引是否能满足使用连接的查询?
EN

Stack Overflow用户
提问于 2018-06-14 11:52:44
回答 1查看 28关注 0票数 0

据我所知,在这样的情况下,复合索引将完成所需的工作:

代码语言:javascript
复制
SELECT name FROM user WHERE id_city = 3 AND id_type = 5

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

但是,如果查询中的一个字段在JOIN语句中使用,另一个字段在where语句中使用,该如何处理呢?示例:

代码语言:javascript
复制
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:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-17 03:45:03

对于您的初始查询,是的,任何顺序的(id_city, id_type)都是最佳的。最后添加name会稍微好一些(因为是“覆盖”)。

继续..。

对于该特定查询,使用以下索引:

代码语言:javascript
复制
friend:   (id_user, id_str)  -- in this order; "covering"
user:     (id_str, name)     -- in this order; "covering"

下面是正在发生的事情:

优化器在WHERE中看到了JOIN和一些关于其中一个表(friends)的东西,所以它决定从friend.

  • To开始处理WHERE,它需要一个从WHERE中的内容开始的索引,也就是说friend不需要太多其他东西,让我们把所有的列都放在索引中,因此“

  • ”。EXPLAIN将通过说Using index.

  • Now,到达另一个表(user)来表明这一点。ON子句需要id_str,所以先把它放在index.

  • Again,中,让我们通过添加name.

来玩这个掩护游戏

我更一般地用来介绍这些东西。

如果您的实际查询看起来有任何不同之处,那么所有的赌注都是错误的。也就是说,我建议的索引可能是有益的,也可能是无益的。

如果您想进一步讨论,请提供

  • SHOW CREATE TABLE
  • The real查询。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50849345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档