2011-01-19 93 views
2

我有一個數據庫表,我需要驗證用戶是否輸入了相同或部分相同的信息。優化多個OR查詢

下面是我在想什麼

的DB佈局

rec_id (pk), user_id, 
name, phone, address_1, address_2, zip, 
company, co_phone, co_address_1, co_address_2, co_zip, 
billing, bi_phone, bi_address_1, bi_address_2, bi_zip 

查詢

SELECT rec_id 
FROM tbl_name 
WHERE user_id = '123456789' 
OR '1112223333' IN (phone, co_phone, bi_phone) 
OR 'John Doe' IN (name, business, billing) 
OR '12345' IN (zip, co_zip, bi_zip) 
OR '123 main street' IN (address_1, co_address_1, bi_address_1) 
OR 'po box 123' IN (address_2, co_address_2, bi_address_2) 

如果有任何數據匹配的(是的將是誤報)我需要舊的rec_id。

想知道是否有更好的方法來做到這一點?

感謝

回答

2

對於此查詢表現良好,你將需要爲每個要測試的列單獨的索引。所有列上的組合索引對OR條件完全沒有幫助(如果您有AND,這將有所幫助)。

但是我會想象你的查詢導致全表掃描,無論你添加了哪些索引。您可能需要使用工會代替或查看嘗試,如果有差別:

SELECT rec_id FROM tbl_name WHERE tax_id = '123456789' 
UNION 
SELECT rec_id FROM tbl_name WHERE phone = '1112223333' 
UNION 
SELECT rec_id FROM tbl_name WHERE co_phone = '1112223333' 
UNION 
SELECT rec_id FROM tbl_name WHERE bi_phone = '1112223333' 
UNION 
SELECT rec_id FROM tbl_name WHERE name = 'John Doe' 
UNION 
SELECT rec_id FROM tbl_name WHERE business = 'John Doe' 
UNION 
SELECT rec_id FROM tbl_name WHERE billing = 'John Doe' 
UNION 
-- etc... 

重寫它像這樣的想法是,現在每個子查詢就可以使用索引(假設,當然,你已經添加了必要的索引)。

+0

嗯有趣,可能不得不嘗試這一個。 – 2011-01-19 21:44:57