首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合索引和左联接如何在MySql中工作?

复合索引和左联接如何在MySql中工作?
EN

Stack Overflow用户
提问于 2020-06-05 03:56:23
回答 1查看 597关注 0票数 1

我有两张桌子如下所示

我在两个表上都有如下所示的综合索引:

  • users表有一个复合索引:(login_type_id,language_id,enabled,level)
  • 地址表有一个复合索引:(user_id,city_id,enabled)

我想执行以下查询

代码语言:javascript
复制
select * from users u
left join address adr
on u.id = adr.user_id
where u.login_type_id = 1
and u.langauge_id = 1
and u.enabled = true
and adr.city_id in (1,2,3,4,5)
and adr.enabled = true
order by u.level

在执行查询时,我期望MySQL对两个表使用复合索引,因为where子句中的所有字段都是索引的。但是MySql使用地址表作为基,并且只使用用户的主键进行连接。

在连接两个表时,MySql是否忽略了一个复合索引?

你们能告诉我为什么MySql不对两个表使用复合索引吗?

要使查询速度最快,请在哪些字段上创建索引?

谢谢。

解释SQL

请注意,实际数据库与问题中的数据库不同,但关系和索引是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 07:01:17

  • 当您在LEFT JOIN的“右”表上有约束时(参见WHERE);优化器将把它转换成常规的JOIN。这允许它重新排列表。
  • PRIMARY KEY通常是到表JOIN的最佳方式。
  • A“覆盖”INDEX是一个具有查询所需的所有列的方法。由于您指定了"covering".
  • The,所以请求从索引中缺少full_name,因此索引中列的顺序不是SELECT *,这可能非常重要。(但在你的例子中并非如此。)这可能导致不使用复合索引,甚至可能是覆盖index.
  • Generally,--最好将=测试的列放在综合索引中。如果不是覆盖索引,优化器将停止在复合索引的第一个“范围”列上。(与example.)
  • IN(1,2,3,4)无关的优化可能像=或范围一样,这取决于组合索引组件在排列列时的moon.
  • Cardinality阶段。
  • 如果优化器认为需要触及索引的20%以上,它将避开索引并使用表扫描。

更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysqlhttp://mysql.rjweb.org/doc.php/index1

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

https://stackoverflow.com/questions/62207887

复制
相关文章

相似问题

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