2011-09-19 38 views
1

我正在使用請求從10個表中選擇數據,並且最後我有WHERE和2個條件 第一個很簡單,但第二個很慢,即使有沒有結果返回。來自多個表的MySQL請求由於WHERE過濾器而變得緩慢

AND (eligible_users.id IS NULL OR 
((eligible_users.program = 3 AND eligible_users.status = 0) 
OR eligible_users.status = 35)) 

當我將其刪除,頁面加載速度快很多,有一些方法,使其更快,但仍保持這種過濾器,因爲我需要它。

+2

你在查詢上運行EXPLAIN了嗎?它說什麼? – jasonbar

+0

也許你需要在你的「狀態」列上有一個索引。你可以像這樣添加它:'CREATE INDEX status_index ON eligible_users(status);' –

+1

另外,我第二個@jasonbar說的。 EXPLAIN的輸出將解釋你的查詢是如何評估的。它會告訴你,如果你在任何地方缺少索引。 –

回答

0

您在查詢3條OR語句,嘗試他們分成1個或多個工會,像這樣:

select ... 
where ... 
eligible_users.id IS NULL 
UNION 
select ... 
where ... 
(eligible_users.program = 3 AND eligible_users.status = 0) 
OR eligible_users.status = 35 
+0

然後,我不能使用它的訂單不起作用,因爲如果它是一個查詢 – JohnU43

+0

@ JohnU43是的,你可以:'select * from(select ... union select ...)t order by t.your_column' – Icarus

0

增加兩個指標,一個是程序,一個用於狀態可能會很好地加快速度。

+0

你的意思是索引在表本身,即使它們沒有在請求中使用 – JohnU43

+0

@ JohnU43是,索引在表上,對於這些特定的字段。索引應該可以幫助數據庫更快地評估你的where子句。 –