Оптимизировать множественный запрос ИЛИ

У меня есть таблица базы данных, где мне нужно проверить, ввел ли пользователь ту же или частично ту же информацию.

Вот что я думаю

Макет БД

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.

Хотел узнать, есть ли лучший способ сделать это?

Спасибо


person Phill Pafford    schedule 19.01.2011    source источник


Ответы (1)


Чтобы этот запрос работал хорошо, вам потребуются отдельные индексы для каждого из тестируемых столбцов. Комбинированный индекс по всем столбцам совсем не поможет для условий ИЛИ (хотя это помогло бы, если бы у вас были И).

Однако я бы предположил, что ваш запрос приведет к полному сканированию таблицы независимо от того, какие индексы вы добавляете. Возможно, вы захотите попробовать использовать UNION вместо OR, чтобы увидеть, имеет ли это значение:

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

Идея такой перезаписи заключается в том, что теперь каждый подзапрос сможет использовать индекс (при условии, конечно, что вы добавили необходимые индексы).

person Mark Byers    schedule 19.01.2011
comment
хм, интересно, надо будет попробовать. - person Phill Pafford; 20.01.2011
comment
@Phill Pafford: UNION ALL работает быстрее, чем UNION, потому что не удаляет дубликаты, но я полагаю, что вы делаете удаление дубликатов здесь. - person Mark Byers; 20.01.2011
comment
Спасибо, но дубликаты не проблема, но ускорьте это. Если я найду запись или две, это не имеет значения, важно, что есть/есть дубликат учетной записи. Спасибо за советы - person Phill Pafford; 20.01.2011