Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация MySQL-запроса / 4 сообщений из 4, страница 1 из 1
27.10.2017, 15:35
    #39543369
Антон777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация MySQL-запроса
Добрый день всем!
Друзья, помогите оптимизировать следующий запрос:

SELECT
`postback_flows`.*,
`shorten_links`.`shorten_url`,
`offers_postback`.`name` AS offer_name,
(SELECT COUNT(*) FROM shorten_transits WHERE url_id = postback_flows.url_id) AS transits,
(SELECT COUNT(*) FROM postback_requests WHERE flow_id = postback_flows.id) AS requests
FROM (`postback_flows`)
LEFT JOIN `offers_postback` ON `offers_postback`.`id` = `postback_flows`.`offer_id`
LEFT JOIN `postback_requests` ON `postback_requests`.`flow_id` = `postback_flows`.`id`
LEFT JOIN `shorten_links` ON `shorten_links`.`id` = `postback_flows`.`url_id`
WHERE `postback_flows`.`user_id` = '733'
AND `postback_flows`.`offer_id` = '320'
GROUP BY `postback_flows`.`id`
ORDER BY `id` desc
LIMIT 10

Основная нагрузка, как я понял, приходится на "(SELECT COUNT(url_id) FROM shorten_transits WHERE url_id = postback_flows.url_id) AS transits" - если убрать этот фрагмент, то запрос срабатывает довольно быстро. Для сведения: таблица shorten_transits содержит на данный момент 245550 строк, а столбцов в ней 19. Помогите, пожалуйста. Уже больше месяца не могу найти решение.
...
Рейтинг: 0 / 0
27.10.2017, 16:09
    #39543399
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация MySQL-запроса
самое простое -- убрать
"(SELECT COUNT(url_id) FROM shorten_transits WHERE url_id = postback_flows.url_id) AS transits"
из запроса и поставить его после выборки ЛИМИТ 10.
...
Рейтинг: 0 / 0
27.10.2017, 16:13
    #39543404
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация MySQL-запроса
типа:

SELECT
(SELECT COUNT(*) FROM shorten_transits WHERE url_id = postback_flows.url_id) AS transits,
(SELECT COUNT(*) FROM postback_requests WHERE flow_id = postback_flows.id) AS requests,
*
FROM
(
SELECT
`postback_flows`.*,
`shorten_links`.`shorten_url`,
`offers_postback`.`name` AS offer_name,
-- (SELECT COUNT(*) FROM shorten_transits WHERE url_id = postback_flows.url_id) AS transits,
-- (SELECT COUNT(*) FROM postback_requests WHERE flow_id = postback_flows.id) AS requests
FROM (`postback_flows`)
LEFT JOIN `offers_postback` ON `offers_postback`.`id` = `postback_flows`.`offer_id`
LEFT JOIN `postback_requests` ON `postback_requests`.`flow_id` = `postback_flows`.`id`
LEFT JOIN `shorten_links` ON `shorten_links`.`id` = `postback_flows`.`url_id`
WHERE `postback_flows`.`user_id` = '733'
AND `postback_flows`.`offer_id` = '320'
GROUP BY `postback_flows`.`id`
ORDER BY `id` desc
LIMIT 10
) z

...ну надо подправить связки, поменять
url_id = postback_flows.url_id
на
url_id = z.url_id
и возможно поработать с алиасами
...
Рейтинг: 0 / 0
27.10.2017, 16:20
    #39543414
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация MySQL-запроса
...да и вообше у вас филтры только по основной таблице,
можно сделать елементарную выборку

SELECT
*
FROM (`postback_flows`)
WHERE `postback_flows`.`user_id` = '733'
AND `postback_flows`.`offer_id` = '320'
ORDER BY `id` desc
LIMIT 10

...и на нее навешивать всякие связки и подселекты...


...отдельный вопрос по связкам, где 1:н где н:1
и почему группировка без груповых функций...

...если есть возможность -- покажите специалисту...
проанализируйте модел и смысл запроса...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация MySQL-запроса / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]