如何在内部连接表上强制索引?

Posted

技术标签:

【中文标题】如何在内部连接表上强制索引?【英文标题】:How to force an index on inner joined tables? 【发布时间】:2011-01-19 14:02:04 【问题描述】:

如何在与此类似的查询上强制索引。我需要分别在 foo 和 bar 上强制建立索引。

SELECT foo.*, bar.*
FROM foo
INNER JOIN bar ON foo.rel_id = bar.rel_id
WHERE foo.status = 1
  AND bar.status = 1

【问题讨论】:

您能否解释一下“强制”索引是什么意思。你的意思是自动创建它(不起作用)还是强制mysql使用它(见下面的帖子)。 【参考方案1】:

显而易见的事情是在两个表的rel_idstatus 上创建一个覆盖索引,以满足连接和位置要求。

到目前为止,您尝试过什么?

编辑

你提供了index hints,但每个人都回答的关键似乎是你不应该这样做。

从 MySQL 4.0.9 开始,你也可以使用 FORCE INDEX,其作用类似于 USE INDEX (index_list) 但添加了 假设表扫描是 非常贵。换句话说,一个 表扫描仅在没有 使用给定索引之一的方法 在表中查找行。

【讨论】:

完全同意,但是我的问题是如何在内部连接上强制索引。【参考方案2】:

假设索引 a 存在于 foo 和索引 b 上:

SELECT foo.*, bar.*
FROM foo FORCE INDEX (a)
INNER JOIN bar FORCE INDEX (b) ON foo.rel_id = bar.rel_id
WHERE foo.status = 1
  AND bar.status = 1

会强制在 MySql 上选择索引

【讨论】:

以上是关于如何在内部连接表上强制索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在连接表上的两个外键之间强制实施数据库约束?

如何在内部连接 ​​Laravel 5 上 ->paginate()

在内部连接中排序

GCM 之类的推送通知如何在内部工作?

unordered_map 如何在内部使用其哈希?

连接表上的索引