gpt4 book ai didi

mysql - 在带有 OR 条件的 MySQL JOIN 中使用索引

转载 作者:可可西里 更新时间:2023-11-01 06:30:24 28 4
gpt4 key购买 nike

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

SELECT parent.field, child.field
FROM parent
JOIN child ON (child.id = parent.id
OR child.id = parent.otherid)

然而,这真的很慢(大约 100k 条记录,并且在真实版本中连接到其他表),但是尽管已经尝试了

上的索引
parent.id (PRIMARY),  
parent.otherid,
child.id (PRIMARY),
and a composite index of parent.id and parent.otherid

在进行此连接时,我无法让 MySQL 使用这些索引中的任何一个。

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

这里有人知道是否可以让这个查询引用一个索引吗?如果是,怎么办?


我的解决方案

(所以不会让我在 atm 下面回答我自己的问题)

大量调整并提出了一个相当不错的解决方案,该解决方案保留了 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 建议,这是促使我来到这里的原因:)

最佳答案

您的查询使一个 child 有两个不同的 parent 在理论上成为可能,这将使其成为非常不标准的术语。然而,让我们假设您的数据模式使这成为不可能。

然后下面使用单独的索引为您提供相同的结果,每列一个索引。

SELECT parent.field, child.field
FROM parent
JOIN child ON child.id = parent.id

UNION ALL

SELECT parent.field, child.field
FROM parent
JOIN child ON child.id = parent.otherid

关于mysql - 在带有 OR 条件的 MySQL JOIN 中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11128339/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com