2014-10-30 78 views
0

我已經通過其他類似標題的問題,但無法弄清楚我的代碼有什麼問題:mysqli select導致錯誤500內部錯誤

所以這裏是簡單的MySQL代碼:

SELECT COUNT(id) AS sum FROM series WHERE id IN (SELECT s_id FROM s_genre WHERE g_id IN (1,5,19) GROUP BY s_id HAVING COUNT(s_id)>=3) AND stype=0 LIMIT 1 

好,其用於計算,如果我們搜索基於一系列體裁多少列將返回。內部代碼將在不到一秒內返回183條記錄,但是當我運行整個代碼時,大約一分鐘後它會返回內部錯誤500。還有系列表中包含約5000條記錄。 s_genre表中包含約25000條記錄。所以你認爲問題是什麼? 感謝提前:)

+0

它最有可能超時,你有沒有嘗試運行在SQL殼整個MySQL查詢看看需要多長時間? – 2014-10-30 21:43:42

回答

1

這是您的查詢:

SELECT COUNT(id) AS sum 
FROM series 
WHERE id IN (SELECT s_id 
      FROM s_genre 
      WHERE g_id IN (1, 5, 19) 
      GROUP BY s_id 
      HAVING COUNT(s_id) >= 3 
      ) AND 
     stype = 0 
LIMIT 1; 

嘗試重新措辭它作爲一個join。這些優化往往更有效:

SELECT COUNT(s.id) AS sum 
FROM series s JOIN 
    (SELECT s_id 
     FROM s_genre 
     WHERE g_id IN (1, 5, 19) 
     GROUP BY s_id 
     HAVING COUNT(s_id) >= 3 
    ) g 
    on s.id = g.s_id 
WHERE stype = 0; 

作爲一個說明,該limit什麼也不做,因爲沒有group by聚合查詢只返回一行。

如果上面沒有提高性能,然後在s_genre(s_id, g_id)創建索引,並編寫使用exists查詢:

select count(s.id) 
from series s 
where s.stype = 0 and 
     exists (select 1 from s_genre g where s.id = g.sid and g.g_id = 1) AND 
     exists (select 1 from s_genre g where s.id = g.sid and g.g_id = 5) AND 
     exists (select 1 from s_genre g where s.id = g.sid and g.g_id = 19);