Прежде всего попробуйте и посмотрите, как выглядит ваш план запроса. Вы можете проверить это с помощью команды EXPLAIN
. Он покажет вам, где вы можете повысить производительность, добавив индексы, где это необходимо.
Во-вторых, я всегда предпочитаю избегать подселектов. Вы можете переписать вышеупомянутый запрос, используя дополнительные объединения на внешнем выделении, и отфильтровать их, как только сможете. Вы можете попробовать следующее и посмотреть, как оно сравнивается:
SELECT *
FROM lm_object
INNER JOIN lm_object_sar var
ON lm_object.id = var.lm_object_id
LEFT JOIN lm_images img1
ON img1.typ = 1
AND img1.thumb = 1
AND (
img1.id = var.id
OR img1.cot_cca = var.cot_cca
)
LEFT JOIN lm_images img2
ON img2.typ = 2
AND img2.thumb = 1
AND (
img2.id = var.id
OR img2.cot_cca = var.cot_cca
)
WHERE var.id IN (@numbers...)
AND lm_object.deleted_at IS NULL
Обратите внимание, что приведенное выше вернет несколько строк, если вы можете иметь больше записей img1 и img2; Я вижу, вы применили LIMIT 1
, что заставляет меня думать, что в результате этих фильтров вы можете получить больше строк.
Если это так, то, вероятно, лучше просто запросить их по отдельности в вашем коде, чем пытаться втиснуть его в один "большой" запрос.
Также рассмотрите возможность мониторинга вашего приложения с помощью службы, такой как newRelic; это может дать вам представление о том, что именно послужило причиной задержки в 50 секунд. Вы уверены, что это ваш запрос к базе данных?