2012-09-04 242 views
0

我在PHP中遇到這個查詢的問題。速度太慢,執行後幾分鐘無法連接到服務器。我一直在從主查詢中移除單獨的子查詢,並發現它在完成最後一個內部查詢後非常順利。緩慢的子查詢mysql查詢

表「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 
      ) 
     ) 
    ) 
+2

不使用IN,它的緩慢。因爲IN不使用JOIN語法對結果進行索引。 – jtheman

+0

這只是一個猜測,但看起來像嵌套子查詢,所以這勢必會讓事情變得更慢。這意味着每行都運行「$ y」的子查詢,然後針對「$ y」的子查詢的每個結果運行子子查詢。也許你應該在查詢上運行解釋,看看發生了什麼 – Gohn67

+0

我不清楚你的查詢想要做什麼。但也許你不需要所有這些子查詢,並可以使用連接? – Gohn67

回答

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 
0

測試,這會產生相同的結果 - 要快很多。

  1. 更換陳述與內部連接。查詢優化器更多的機會來優化這種方式
  2. 消除你或聲明 - 我這樣做是使用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