MySQL联合索引or_使用带有OR条件的MySQL JOIN中的索引

针对MySQL中JOIN操作涉及OR条件导致查询效率低下问题,本文介绍了一种通过子查询和索引来提高查询性能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在运行一个看起来像这样的查询

SELECT parent.field, child.field

FROM parent

JOIN child ON (child.id = parent.id

OR child.id = parent.otherid)

然而,这是非常慢的(大约100k记录,并且JOIN到真实版本中的其他表),但尽管尝试了索引

parent.id (PRIMARY),

parent.otherid,

child.id (PRIMARY),

and a composite index of parent.id and parent.otherid

在进行此连接时,我无法让MySQL使用任何这些索引.

我读到MySQL每个连接只能使用一个索引,但是当JOIN包含OR条件时,它是否可以在任何地方找到它是否可以使用复合索引.

有没有人知道是否可以使此查询引用索引?

如果是这样,怎么样?

我的解决方案

(所以我不会让我回答下面的问题)

一堆调整,并提出了一个相当不错的解决方案,保留了JOIN和聚合其他表的能力.

SELECT parent.field, child.field

FROM parent

JOIN (

SELECT parent.id as parentid,

# Prevents the need to union

IF(NOT ISNULL(parent.otherid) AND parent.otherid <> parent.id,

parent.otherid,

parent.id) as getdataforid

FROM parent

WHERE (condition)

) as foundrecords

ON foundrecords.parentid = parent.id

JOIN child ON child.id = parent.getdataforid

对于速度需要子查询中的条件来减少放置在临时表中的记录数,但是我在外部查询上有大量额外的连接,一些连接到子节点,一些连接到父节点(有一些聚合)所以这一个最适合我.

在许多情况下,联合将更快,更有效,但由于我在父级上过滤,但是想要从子级(父级自引用)获得额外的数据,因此联合为我创造了额外的行,我无法合并.

有可能只能通过将父级连接到自身并在外部查询中使用where条件别名来找到相同的结果,但是这个对我很有效.

感谢Jirka对UNION ALL的建议,这是促使我到达这里的原因:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值