0

我在 PHP 中遇到了这个查询的问题。它太慢了,执行后几分钟我无法连接到服务器。我一直在从主查询中删除单独的子查询,并发现在我删除最后一个内部查询后它工作得非常顺利。

表“u”有 30.000 行,表“u_r”大约有 17.000 行,表“u_s”大约有 13.000 行,表“s”大约有 100 行。尽管表“u_r”和“u_s”有很多行,但只有 2-3 行有与条件匹配的相同“id_u”。

我希望,我提供了足够的信息。如果您还需要了解其他信息,请随时在评论中提问。

SELECT DISTINCT id_p
FROM u
WHERE
    '$x' IN(
        SELECT id_p
        FROM u_p
        WHERE id_u=u.id_u
    )
    AND
    (
        '$y' IN (
            SELECT id_r
            FROM u_r
            WHERE id_u=u.id_u
        )
        OR
        '$y' IN (
            SELECT DISTINCT id_r
            FROM s
            WHERE id_s IN (
                SELECT id_s //without this query, everything works fine
                FROM u_s
                WHERE id_u=u.id_u
            )
        )
    )
4

2 回答 2

1

我认为你可以改变:

SELECT DISTINCT id_r 
        FROM s 
        WHERE id_s IN ( 
            SELECT id_s //without this query, everything works fine 
                FROM u_s 
                WHERE id_u=u.id_u 

SELECT s.id_s
        FROM u_s 
             INNER JOIN s ON u_s=id_u=u.id_u
        WHERE u_s.id_u = u.id_u
        GROUP BY s.id_r

没有经过测试,因为我正试图将头绕在结构上。

还记得检查索引。作为一个粗略的指南,你应该在“WHERE”和“ON”索引中的任何内容:

u_p.id_u
u_r.id_u
u_s.id_u
s.id_s
于 2012-09-04T01:13:05.663 回答
0

测试这会产生相同的结果 - 应该更快。

  1. 用内部连接替换 IN 语句。查询优化器有更多机会以这种方式进行优化
  2. 消除您的 OR 语句 - 我使用 UNION 执行此操作。我认为如果您愿意,您可能可以使用 LEFT JOIN 来消除 OR。
  3. 您需要对此进行测试 - 我没有任何示例数据。
select distinct id_p
from u
inner join u_p
on u.id_u = u_p.id_u
and u_p.id_u = '$x'
inner join
(
  select id_r.id_u
  from u_r
  where id_r = '$y'   
  union
  select id_r
  from s
  inner join u_s
  on s.id_u = u_s.id_u
  where id_r = '$y'
) as subq
on u.id_u = subq.id_u
于 2012-09-04T02:14:25.257 回答