2010-11-25 5 views
1

У меня есть индексы по tbl1.date и tbl2.datetime. Когда я делаю следующее:Преобразование даты и времени

EXPLAIN SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl2.datetime = tbl1.date 

tbl2.datetime индекс привыкает (как и ожидалось)

Очевидно, что мне нужно преобразовать tbl2.datetime в дату для того, чтобы SELECT заявление на работу в реальной жизни. Однако это не приводит к тому, что ни один из используемых индексов не используется:

EXPLAIN SELECT * FROM tbl1 LEFT JOIN tbl2 ON DATE(tbl2.date) = tbl1.date 

Что мне не хватает?

UPDATE: Я пытался что-то подобное, но получаю синтаксическую ошибку

«# 1064 .... проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с" SELECT * FROM tbl1 LEFT JOIN tbl2 нА ДАТУ (SELECT * FROM (SELECT DISTINCT FROM DateTime tbl2.datetime) в стемы»в строке 1"

EXPLAIN SELECT * FROM tbl1 LEFT JOIN tbl2 ON DATE(SELECT * FROM (SELECT DISTINCT   
datetime FROM tbl2.datetime) as tempTable) = quotes.GOOG.date 
+0

опечатка: DATE (tbl2.date) -> DATE (tbl2.datetime) – Riedsio 2010-11-25 22:34:48

ответ

3

Что мне не хватает?

Ничего - вы не можете изменять данные или тип данных и рассчитывать на возможность использования индекса.

При изменении для сравнения нет никакой связи между значением в индексе и значением, которое вы хотите/должны использовать. Единственный вариант - сохранить значение таким образом, чтобы не требовать изменения, если вы хотите, чтобы индекс стал использоваться.

+0

все, что я могу сделать для обходного пути? – kristen 2010-11-25 21:52:18

0

Интересный вопрос. В качестве обходного пути я пытался изолировать DATETIME с одной стороны, из условия соединения ...

EXPLAIN SELECT * 
FROM tbl1 
LEFT JOIN tbl2 ON tbl2.datetime 
BETWEEN CONCAT(tbl1.date, ' 00:00:00') AND CONCAT(tbl1.date, ' 23:59:59') 

FWIW, это был провал.

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