簡體   English   中英

帶有子查詢的慢速MySQL查詢

[英]Slow mysql query with subqueries

我在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
            )
        )
    )

我認為您可以更改:

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

測試是否會產生相同的結果-應該更快。

  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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM