2015-07-18 4 views
2

У меня есть запрос на моем сайте, который создает узкое место в скорости. Опытный разработчик PHP/MySql посмотрел на запрос и сразу увидел проблему, немного объяснил, как она должна быть оптимально структурирована, а затем (как это бывает со многими веб-разработчиками, к сожалению) быстро исчезла.LEFT JOIN | ORDER BY query speed

Вот проблемный вопрос:

SELECT DISTINCT a.id, a.title, a.thumb_image 
FROM artwork a 
LEFT JOIN galleries_artwork ga 
ON a.id = ga.artwork_id 
WHERE ga.galleries_id = $gallery_id 
ORDER BY ga.position 

Он сказал, что запрос был сортировки результирующего набора в пути, который занимает 3 раза больше, чем если бы она была переписана, чтобы положить в начале [... и вот где я не могу точно помнить, что он объяснил].

Может ли кто-нибудь увидеть, что с этим не так, с точки зрения оптимизации скорости, и объяснить, и что бы оптимизировать его?

Большое спасибо!

ответ

2

distinct является серьезной проблемой. Кроме того, вы поворачиваете left join в качестве inner join из-за оговорки where, так что это может быть то, что вы хотите:

SELECT a.id, a.title, a.thumb_image 
FROM artwork a JOIN 
    galleries_artwork ga 
    ON a.id = ga.artwork_id 
WHERE ga.galleries_id = $gallery_id 
ORDER BY ga.position 

индексов на galleries_artwork(galleryies_id, position, artwork_id) и artwork(id, title, thumb_image) будет оптимальным для данной версии запроса.

+0

Ваш предлагаемый пересмотр действительно ускоряет его; разработчик MIA обсуждал что-то о размещении элементов запроса в круглых скобках, как вы предлагаете дальше. Но это означало бы это: ВЫБЕРИТЕ A.id, a.title, a.thumb_image из художественных изображений (идентификатор, название, thumb_image) объединение galleries_artwork (galleries_id, положение, artwork_id) га ON A.id = га. artwork_id WHERE ga.galleries_id = $ gallery_id ORDER BY ga.position ? – Tom

+0

@Tom. , , Я не думаю, что это повлияет на производительность. –

+0

Спасибо, Гордон ... Я неправильно понял вторую часть вашего предложения. Я проверил базу данных, и не все индексы, которые вы указали, были проиндексированы; Я проиндексировал их, и теперь поиск должен работать, как вы предложили. – Tom