2011-01-19 2 views
2

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

Вот что я имею в виду

ДБ раскладка

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 (это помогло бы, если бы у вас были ANDs).

Однако я бы предположил, что ваш запрос приводит к полному сканированию таблицы независимо от того, какие индексы вы добавляете. Вы можете попробовать использовать союзы вместо 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... 

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

+0

hmm интересно, возможно, придется попробовать этот. –

+0

как насчет UNION ALL вместо UNION? эффективность? –

+1

@Phill Pafford: UNION ALL быстрее, чем UNION, потому что он не удаляет дубликаты, но я предполагаю, что вы * сделаете * хотите удалить дубликаты здесь. –

Смежные вопросы