2011-01-19 13 views
2

ユーザーが同じ情報または部分的に同じ情報を入力した場合に検証する必要があるデータベーステーブルがあります。データの一致のいずれかの場合はここで複数のORクエリを最適化する

は、私が(はいインクルードは偽陽性となります)クエリ

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 (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 

私は

を考えているものです古い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

興味深いことに、これを試す必要があるかもしれません。 –

+0

UNIONではなくUNION ALLはどうですか?パフォーマンスは賢明ですか? –

+1

@Phill Pafford:UNION ALLは重複を除去しないのでUNIONより高速ですが、ここで重複を削除したいと思います。 –