Оптимизация индекса mysql для упорядоченного запроса с диапазоном

Я ищу помощи с некоторыми оскорбительными запросами mysql, которые я в настоящее время выполняю на моем сервере. Моя цель - показать самые дорогие товары ebay с временем окончания менее одного месяца назад.

Я использую MySQL 5.1.

Мой запрос выглядит следующим образом ('ebay_items' имеет ~350,000 строк):

explain SELECT `ebay_items`.* FROM `ebay_items` 
WHERE (endtime > NOW()-INTERVAL 1 MONTH) ORDER BY price desc\G;

yields:

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: ebay_items
type: range
possible_keys: endtime
key: endtime
key_len: 9
ref: NULL
rows: 71760
Extra: Using where; Using filesort
1 row in set (0.00 sec)

Этот запрос приводит к дорогому 'filesort', использующему 71760 строк.

show indexes on ebay_items;

результаты (я включил только рассматриваемый индекс 'endtime'):

*************************** 7. row ***************************
Table: ebay_items
Non_unique: 1
Key_name: endtime
Seq_in_index: 1
Column_name: endtime
Collation: A
Cardinality: 230697
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment: 
*************************** 8. row ***************************
Table: ebay_items
Non_unique: 1
Key_name: endtime
Seq_in_index: 2
Column_name: price
Collation: A
Cardinality: 230697
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment: 

Используется только ключ 'endtime' составного индекса endtime (endtime, price). Насколько я знаю, MySQL не будет эффективно использовать составной индекс при работе с запросом диапазона в сочетании с предложением 'order by'.

Нашел ли кто-нибудь хорошее решение этой проблемы? Я бы хотел решить эту проблему на уровне БД (либо более разумным использованием индексов, либо изменением схемы), но я открыт для предложений.

Один из способов избежать запроса диапазона - это фоновая задача, выполняемая каждые X часов и отмечающая поле типа enum в ebay_items как '<1 day old', '<1 week old', '<1 month old' и т.д. Я надеялся решить эту проблему более чистым способом.

Есть ли способ эффективно выполнить MySQL range query с предложением order by, запросы?

Огромная благодарность за помощь!

Edit: Kohányi Róbert сделал хорошее замечание, что я должен уточнить точную проблему, которую я имел с запросом. Запрос приводит к тому, что дисковый ввод-вывод зацикливается на время его выполнения. Если несколько таких запросов выполняются одновременно, процессы становятся резервными и машина блокируется. Я предполагаю, что файловый сортировщик съедает ввод-вывод.

Я также должен упомянуть, что таблица использует движок MyISAM. Будет ли использование движка InnoDB более производительным и менее интенсивным в плане ввода-вывода? Еще раз спасибо.

5
задан Will Sulzer 5 December 2011 в 06:42
поделиться