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

クエリ

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 が必要です。

これを行うためのより良い方法があるかどうか知りたいですか?

ありがとう

4

1 に答える 1

2

このクエリを適切に実行するには、テストする列ごとに個別のインデックスが必要です。すべての列の結合インデックスは、OR 条件ではまったく役に立ちません (ただし、AND があれば役に立ちます)。

ただし、追加するインデックスに関係なく、クエリの結果は完全なテーブルスキャンになると思います。OR の代わりに UNION を使用して、違いがあるかどうかを確認してください。

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

このように書き直すという考えは、各サブクエリがインデックスを使用できるようになるということです (もちろん、必要なインデックスを追加したことが前提です)。

于 2011-01-19T21:42:08.777 に答える