У меня есть две таблицы с несколькими тысячами строк, каждая из которых мне нужна, чтобы присоединиться к дате времени между 2 датами.Производительность, соединяющая строки, где дата находится между датой начала и окончания
select SQL_NO_CACHE * from A
left outer join R on R.ActivityDate > A.StartDate and R.ActivityDate < A.EndDate;
В настоящее время запрос довольно медленный. Я попытался добавить индексы, но они не используются в соответствии с результатом объяснения. Какова подходящая стратегия индексирования для такого запроса? Использование между не вместо <>, похоже, не имеет значения.
Если выполняется прямое соединение, запрос выполняется в 13 раз быстрее (на 7% меньше строк), но логически мне нужны непревзойденные строки для возврата. Я бы не ожидал, что разница между двумя типами соединений будет такой большой, если количество дополнительных строк будет настолько низким. Почему внешнее соединение настолько медленнее?
Любая помощь или мысли оценены.
mysql> describe A;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| StartDate | datetime | NO | | NULL | |
| EndDate | datetime | NO | | NULL | |
| Data | varchar(100) | NO | | NULL | |
+-----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> describe R;
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| ActivityDate | datetime | NO | | NULL | |
| Leads | int(11) | NO | | NULL | |
+--------------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Использование '<' and/or '>' обычно не будет использовать индекс. –
Я не уверен, что вы получите какое-либо улучшение, но попробовали ли вы 'BETWEEN' вместо'> 'и' <'? – Nikos
Я пробовал между. Я добавлю это к вопросу. – Peter