Оптимизировать SQL-запрос с 2 выборами - PullRequest
1 голос
/ 14 апреля 2019

Я пытаюсь обновить одиночный файл campaign.id с минимальным значением used_time (datetime) на основе user.id, но для выполнения следующего кода требуется около 5 секунд.Таблица обратных ссылок содержит 1 миллион строк.

UPDATE `backlinks` 
SET
`backlinks`.`crawler_id` = 'test', 
`backlinks`.`used_time`=NOW() 
WHERE
`backlinks`.`campaign_id`=(
SELECT `id` FROM `campaigns` 
WHERE `campaigns`.`completed`=false 
AND `campaigns`.`status`=true 
GROUP BY `campaigns`.`user_id` 
ORDER BY `campaigns`.`used_time` ASC 
limit 1
)
AND `backlinks`.`googlebot_id` IS NULL 
AND `backlinks`.`used_time` IS NULL 
LIMIT 1;

1 Ответ

1 голос
/ 14 апреля 2019

Вы можете попробовать UPDATE с JOIN с помощью подзапроса.

UPDATE `backlinks` b
JOIN (
    SELECT c.id
    FROM campaigns c
    WHERE exists (
        SELECT 1 
        FROM campaigns cc
        WHERE c.user_id = cc.user_id
        GROUP BY cc.user_id
        HAVING min(cc.used_time) = c.used_time
    )
) t1 on b.`campaign_id` = t1.id
SET
    b.`crawler_id` = 'test', 
    b.`used_time`=NOW() 
WHERE 
    b.`googlebot_id` IS NULL 
AND 
    b.`used_time` IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...