gpt4 book ai didi

mysql - 我如何用一个大的 IN 子句优化这个 SQL 查询?

转载 作者:行者123 更新时间:2023-11-29 06:53:31 25 4
gpt4 key购买 nike

我有一个相当复杂的操作,我试图只用一个 SQL 查询来执行,但我不确定这是否比将它分解成 n 个查询更理想或更不理想。基本上,我有一个名为“用户”的表,其中包含用户 ID 及其关联的 fb_id(id 是 pk,fb_id 可以为空)。

+-----------------+
| id | .. | fb_id |
|====|====|=======|
| 0 | .. | 12345 |
| 1 | .. | 31415 |
| .. | .. | .. |
+-----------------+

我还有另一个名为“Friends”的表,表示两个用户之间的 friend 关系。这使用他们的 id(而不是他们的 fb_id)并且应该是双向关系。

+----------------+
| id | friend_id |
|====|===========|
| 0 | 1 |
| 1 | 0 |
| .. | .. |
+----------------+
// user 0 and user 1 are friends

问题来了:我们获得了特定用户的 ID(“my_id”)和该用户的 Facebook 好友数组(称为 fb_array 的 fb_id 数组)。我们想更新 Friends 表,以便将 Facebook 友谊视为我们用户之间的有效友谊。请务必注意,并非他们所有的 Facebook 好友都会在我们的数据库中拥有帐户,因此应忽略这些好友。每次用户登录时都会调用此查询,以便在他们在 Facebook 上添加任何新 friend 时更新我们的数据。这是我写的查询:

INSERT INTO Friends (id, friend_id)
SELECT "my_id", id FROM Users WHERE id IN
(SELECT id FROM Users WHERE fb_id IN fb_array)
AND id NOT IN
(SELECT friend_id FROM Friends WHERE id = "my_id")

第一个 IN 子句的要点是获取同时也是您的 Facebook 好友的所有用户的子集,这是我担心的主要部分。因为 fb_ids 是作为数组给出的,所以我必须将所有 id 解析为一个由逗号分隔的巨大字符串,该字符串构成“fb_array”。我担心为该 IN 子句设置如此庞大的字符串的效率(用户可能在 Facebook 上有成百上千个 friend )。您能想出更好的方法来编写这样的查询吗?

同样值得注意的是,这个查询并没有保持 friend 关系的双重性质,但这不是我担心的(为此扩展它是微不足道的)。

最佳答案

如果我没记错的话,你的查询可以被简化,如果你对组合 (id, friend_id) 有一个 UNIQUE 约束,到:

INSERT IGNORE INTO Friends 
(id, friend_id)
SELECT "my_id", id
FROM Users
WHERE fb_id IN fb_array ;

您应该在 User (fb_id, id) 上建立索引并测试效率。如果数组中的项目数太大(超过几千),您可能不得不拆分数组并多次运行查询。使用您的数据和设置进行配置。

关于mysql - 我如何用一个大的 IN 子句优化这个 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149689/

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