2016-05-09 3 views
1

У меня есть запрос, как это:MySQL использование индекса для запроса с ИЛИ

SELECT account.name, address.first_line 
FROM account 
JOIN address ON address.id = account.address_id 
WHERE 
(account.date_updated >= '2016-05-05 12:00:00' 
OR 
address.date_updated >= '2016-05-05 12:00:00') 

как стол пользователя и адрес таблица имеет индекс на свои «date_updated» колонки, но когда я делаю объяснить ни один из этих индексов не используется.

Есть ли способ изменить это? Или просто мне нужно запустить два отдельных запроса, чтобы получить информацию, которую я хочу, используя используемые индексы.

Я думаю, что этот вопрос отличается от этого вопроса: MySQL: how to index an "OR" clause, потому что поля по обе стороны от «OR» взяты из разных таблиц, поэтому вы не можете поместить на них составной индекс.

+0

Возможный дубликат [MySQL: как индексировать предложение «ИЛИ»] (http://stackoverflow.com/questions/2829544/mysql-how-to-index-an-or-clause) –

ответ

0

MySQL не использует индексы для WHERE статей, которые содержат OR. This question имеет дополнительную информацию. MySQL WHERE clause documentation.

Я бы попытаться союзе два вместе, как

SELECT account.name, address.first_line FROM account 
JOIN address ON address.id = account.address_id 
WHERE account.date_updated >= '2016-05-05 12:00:00' 

UNION 

SELECT account.name, address.first_line FROM account 
JOIN address ON address.id = account.address_id 
WHERE address.date_updated >= '2016-05-05 12:00:00' 
+0

Ответ Гордона немного лучше этого; он объясняет, почему. –

1

Это трудно для баз данных для оптимизации OR. Один из способов заключается в использовании UNION или UNION ALL:

SELECT a.name, ad.first_line 
FROM account a JOIN 
    address ad 
    ON ad.id = a.address_id 
WHERE a.date_updated >= '2016-05-05 12:00:00' 
UNION ALL 
SELECT a.name, ad.first_line 
FROM account a JOIN 
    address ad 
    ON ad.id = a.address_id 
WHERE ad.date_updated >= '2016-05-05 12:00:00' AND 
     a.date_updated < '2016-05-05 12:00:00' 

Вы можете написать этот запрос, используя UNION вместо UNION ALL и оставить вне пункт NOT EXISTS. Однако повторение дублирования в UNION часто медленнее, чем просто удаление возможных дубликатов с использованием предложения WHERE.