首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL -使用多个子查询优化查询

PostgreSQL -使用多个子查询优化查询
EN

Stack Overflow用户
提问于 2019-01-07 06:31:49
回答 1查看 421关注 0票数 0

我有两张桌子,userssessions。这些表格如下所示:

用户- id (int),name (varchar)

会话- id (int)、user_id (int)、ip (Int)、cookie_identifier (varchar)

所有列都有索引。

现在,我正在尝试查询与特定用户具有相同ipcookie_identifier会话的所有用户。

下面是我的问题:

代码语言:javascript
复制
SELECT *
FROM "users"
WHERE "id" IN
    (SELECT "user_id"
     FROM "sessions"
     WHERE "user_id" <> 1234
       AND ("ip" IN
              (SELECT "ip"
               FROM "sessions"
               WHERE "user_id" = 1234
               GROUP BY "ip")
            OR "cookie_identifier" IN
              (SELECT "cookie_identifier"
               FROM "sessions"
               WHERE "user_id" = 1234
               GROUP BY "cookie_identifier"))
     GROUP BY "user_id")

users表有大约200,000行,sessions表有大约150,000行。查询大约需要3-5秒。

有可能优化这些结果吗?

EN

回答 1

Stack Overflow用户

发布于 2019-01-07 07:04:48

作为试验,我建议删除所有分组:

代码语言:javascript
复制
SELECT
    *
FROM users
WHERE id IN (
    SELECT
        user_id
    FROM sessions
    WHERE user_id <> 1234
    AND (ip IN (
            SELECT
                ip
            FROM sessions
            WHERE user_id = 1234
            )
        OR cookie_identifier IN (
            SELECT
                cookie_identifier
            FROM sessions
            WHERE user_id = 1234
            )
        )
    )
;

如果这样做没有帮助,请尝试更改上面的代码,以使用EXISTS而不是IN

代码语言:javascript
复制
SELECT
    *
FROM users u
WHERE EXISTS (
    SELECT
        NULL
    FROM sessions s
    WHERE s.user_id <> 1234
    AND u.id = s.user_id
    AND EXISTS (
        SELECT
            NULL
        FROM sessions s2
        WHERE s2.user_id = 1234
        AND (s.ip = s2.ip
          OR s.cookie_identifier = s2.cookie_identifier
            )
        )
    )
;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54066544

复制
相关文章

相似问题

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