2015-01-10 2 views
1

Следующий запрос показывает в моем журнале не используя индекс:MySQL запрос с псевдонимом, не используя индекс

SELECT ordinal,YEAR(ceremonydate) as yr 
FROM awardinfo 
ORDER BY YEAR(ceremonydate) DESC LIMIT 1; 

Объяснить показывает, что это не с помощью индекса:

id: 1 
select_type: SIMPLE 
table: awardinfo 
type: ALL 
possible_keys: NULL 
key: NULL 
key_len: NULL 
ref: NULL 
rows: 72 
Extra: Using filesort 

порядковое, у церемониата есть индекс. Не используются ли они из-за псевдонима yr? Есть ли способ создать индекс на YEAR (festonydate) вместо того, чтобы просто церемониться? Или есть способ индексировать псевдоним?

ответ

0

Это из-за псевдонима. ORDER BY может использовать индекс, если он упорядочивает то, что индексируется. Пока ceremonyDate дата может быть проиндексирована, YEAR(ceremoneyDate) изменяет значение ceremonyDate на что-то совершенно другое, поэтому YEAR(ceremoneyDate) не индексируется.

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

Вы должны быть в состоянии сделать это и использовать индекс:

SELECT ordinal,YEAR(ceremonydate) as yr 
FROM awardinfo 
ORDER BY ceremonydate DESC LIMIT 1; 

Не зная, что выглядит ваши данные, как, что может работать для вас, а.

Подробнее: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

0

Вы можете проверить это, выполнив простой запрос на выборку и используя псевдоним: SELECT ordinal, ceremonydate as yr FROM ... и начать добавлять сложность запроса, чтобы увидеть, где перестают быть использованы индексы. Скорее всего, потому что вы заказываете на основе YEAR(ceremonydate) mysql создает временную таблицу. Лучше всего обработать церемониат в своем коде. MySQL теряет большую эффективность при встроенной обработке и вычислении, например YEAR(), потому что он должен создавать эти временные таблицы.

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