Оптимизировать MySQL запрос фреймворк Laravel

227
15 июля 2017, 07:33

Доброго времени суток, друзья. Помогите оптимизировать запрос для фильтрации данных. Есть такой запрос, сейчас он отрабатывает 1,5 секунды. Возможно ли как то ускорить его работу?

EXPLAIN SELECT r.id, o.name AS objectName,
                            (SELECT MAX(d2.`valuePercent`) FROM discounts AS d2
                                                           JOIN `rooms` AS r2 ON d2.`roomId` = r2.id
                                                           WHERE r2.objectId = r.objectId) AS `valuePercent`,
                            d.type, o.stars, o.`infoAboutObject`, o.id AS objectId, o.url,
                            r.`price`, o.`address`, o.`image`, c.`name` AS cityName, o.longitudeGps, o.latitudeGps,
                            (SELECT GROUP_CONCAT(DISTINCT otp1.`class` SEPARATOR ',') FROM objects_types_pluses AS otp1
                            JOIN objects_objects_types_pluses AS ot1 ON ot1.`objectTypePlusesId` = otp1.id WHERE ot1.`objectId` = o.id)
                            AS className,
                            (SELECT GROUP_CONCAT(DISTINCT otp1.`name` SEPARATOR ',') FROM objects_types_pluses AS otp1
                            JOIN objects_objects_types_pluses AS ot1 ON ot1.`objectTypePlusesId` = otp1.id WHERE ot1.`objectId` = o.id)
                            AS pluseName,
                            (SELECT COUNT(rev.id) FROM reviews AS rev WHERE rev.objectId = o.`id`) AS reviewCount,
                            (SELECT GROUP_CONCAT(DISTINCT os1.`name` SEPARATOR ',') FROM objects_servises AS os1
                            JOIN objects_relation_objects_servises AS oros ON oros.`objectServiceId` = os1.id WHERE oros.`objectId` = o.id)
                            AS objectsServisesName,
                            GROUP_CONCAT(DISTINCT os.`name` SEPARATOR ',') AS objectsServisesName,
                            o.raitingValue
                            FROM objects AS o
                            JOIN cities AS c ON o.`cityId` = c.`id`
                            LEFT JOIN objects_objects_types_pluses AS op ON op.`objectId` = o.id
                            LEFT JOIN `objects_types_pluses` AS otp ON op.`objectTypePlusesId` = otp.`id`
                            JOIN rooms AS r ON o.`id` = r.`objectId`
                            LEFT JOIN discounts AS d ON r.`id` = d.`roomId`
                            LEFT JOIN objects_relation_objects_servises AS oros ON o.`id` = oros.`objectId`
                            LEFT JOIN objects_servises AS os ON oros.objectServiceId = os.`id`
                            WHERE (
                                    d.`valuePercent` =
                                    (
                                        SELECT MAX(d1.`valuePercent`)
                                            FROM discounts AS d1
                                            JOIN `rooms` AS r1 ON d1.`roomId` = r1.id
                                            WHERE r1.objectId = r.objectId

                                    ) OR d.`valuePercent` IS NULL
                                  )  AND c.countryId = 1
                            GROUP BY o.id
                             LIMIT 7 OFFSET 0

READ ALSO
Задать параметр в JPA Repository

Задать параметр в JPA Repository

Нужно из базы даних вытянуть топ категорий по их рейтингуНапример: "SELECT category_name FROM category ORDER BY rating DESC LIMIT ?" вместо знака вопроса должен передаваться...

273
Как посчитать без счетчика?

Как посчитать без счетчика?

Есть файл, содержимое которого строки, каждая строка – числоНапример : 4 4

253
Написание p2p сервера на java

Написание p2p сервера на java

Есть ряд пользователей , каждый из которых имеет некоторое свойствоПусть это свойство будет - ID

339
Как правильно писать код

Как правильно писать код

Часто в примерах по программированию в Android встречаю записи, например, такого вида:

446