2015-08-12 2 views
3

У меня есть следующий запрос, который занимает около 20 секунд при записи 60 000 в таблице продаж. Я понимаю, что проблема ORDER BY и LIMIT вызывают проблему, так как при удалении ORDER BY возвращается через 0,10 секунды.Mysql ORDER BY и LIMIT медленный запрос

Я не уверен, как оптимизировать этот запрос, любые идеи?

Explain, выход здесь https://gist.github.com/anonymous/1b92fa64261559de32da

SELECT sale.saleID as id, 
node.title as location, 
sale.saleTotal as total, 
sale.saleStatus as status, 
payment.paymentMethod, 
field_data_field_band_name.field_band_name_value as band, 
invoice.invoiceID, 
field_data_field_first_name.field_first_name_value as firstName, 
field_data_field_last_name.field_last_name_value as lastName, 
sale.created as date 

FROM sale     
LEFT JOIN payment 
ON payment.saleID = sale.saleID 
LEFT JOIN field_data_field_location 
ON field_data_field_location.entity_id = sale.registerSessionID 
LEFT JOIN node 
ON node.nid = field_data_field_location.field_location_target_id  
LEFT JOIN invoice 
ON invoice.saleID = sale.saleID       
LEFT JOIN profile 
ON profile.uid = sale.clientID      
LEFT JOIN field_data_field_band_name 
ON field_data_field_band_name.entity_id = profile.pid 
LEFT JOIN field_data_field_first_name 
ON field_data_field_first_name.entity_id = profile.pid 
LEFT JOIN field_data_field_last_name 
ON field_data_field_last_name.entity_id = profile.pid 
ORDER BY sale.created DESC 
LIMIT 0,50 
+0

индексы jeremy! Я вижу, что слепой, извините, просто видел, что ваша ссылка на ссылку – Drew

ответ

3

Возможно, вы не можете ничего сделать. Например, когда вы измеряете производительность, смотрите ли вы время, чтобы вернуть первую запись или весь набор результатов? Без order by запрос может быстро вернуть первую строку, но вам все равно придется немного подождать, чтобы получить все строки.

Предполагая, что сравнение действительно, нижеследующий индекс может справка: sale(created, saleId, clientId, SaleTotal, SaleStatus. Это индекс покрытия для запроса, тщательно сконструированный, чтобы его можно было прочитать в правильном порядке. Если это позволяет избежать окончательного сортировки, тогда он должен ускорить запрос, даже для получения первой строки.

+0

хорошая «накрывающая» может заставить ее кричать – Drew

+0

Я измеряю производительность по всему набору результатов, я попробую этот индекс покрытия и посмотрю – jeremy

+0

К сожалению, это не помогло .. – jeremy

2

Минимально:

ALTER TABLE `sale` ADD INDEX (`saleID` , `created`); 
ALTER TABLE `invoice` ADD INDEX (`saleID`); 
0

Индексы первым. Но другой метод, относящийся к LIMIT, используемый, например, для подкачки, заключается в использовании значений: последняя строка страницы дает начальное значение для поиска следующей страницы.

Как вы используете ORDER BY sale.created DESC вы могли догадаться, достаточно большой период:

WHERE sale.created > CURRENT_DATE() - INTERVAL 2 MONTH 

индекс на созданный сусло.