我在寫一個存儲過程,它的功能是獲取許多參數(由最終用戶填充)並執行搜索。但是,如果參數沒有值,則不應將其包含在WHERE子句中。爲此,我本人對參數進行檢查作爲or子句的第一部分,像這樣:通過連接表上的參數檢查減慢MySQL查詢
... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2) ...
我已經然後將這一成普通的SELECT語句,像這樣:
SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)
請注意,爲了清楚起見,本例中我只包含了一個參數。真正的查詢包含多個參數和字段比較。
這工作正常並且運行很快(例如,'真正的'查詢返回約0.5秒的結果)。
到目前爲止這麼好。但是,當引入一個連接表時,事情就會出錯。例如,如果我執行下面的查詢,它需要更長的時間(3-4秒的實際查詢):
SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON t1.table2Id = t2.id
WHERE (param1 = '' OR t2.field1 = param1)
請注意該參數現在被比作場的連接表(表2)。
請注意,在這兩個例子中,運行查詢時,我已經確保參數1中填充了值。
現在,如果我刪除上述WHERE子句的param1 = '' OR
部分,它的運行速度與以前的未連接查詢相同。
我的表中使用的字段都沒有索引,儘管我已經嘗試了這一點,但對於我遇到的問題沒有任何影響。
那麼,有沒有人可以向我解釋爲什麼第一個查詢(單個表)工作的很快,但第二個查詢(連接表)花費的比例過長?
非常感謝提前。
謝謝埃文。我按照你的建議嘗試過,但是現在當param1有一個值時我沒有得到結果。 – 2013-04-05 12:07:36
@JohnP查看更新 - 只刪除最後一行 – 2013-04-05 13:22:20
對不起埃文。不幸的是,現在我不能沒有價值地'過濾'任何參數。 – 2013-04-05 13:35:19