Объединить 2 запроса на обновление в одном запросе - производительность - PullRequest
1 голос
/ 17 апреля 2019

Я программирую любимую функцию.

Например, у нас есть несколько адресов, и мы можем выбрать один из них как любимый.

На данный момент у меня есть 2 запроса для выполнения этой работы:

UPDATE userdata
SET maindata = 0
WHERE 
cid = :id;

UPDATE userdata
SET maindata = 1
WHERE 
cid = :id AND id = :id2
LIMIT 1

В первом запросе я делаю все адреса как "без фаворитов", а во втором я делаю новый выбранный адрес как любимый.

Есть ли способ улучшить этот запрос или переписать оба в 1? Или даже лучшее решение?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Если вы хотите один запрос, вы можете использовать случай, когда (или if) для производительности

update  userdata 
set maindate = case when id = :id2 then 1 
                else 0 end 
where  cid = :id;

Убедитесь, что у вас есть правильный индекс для столбцов пользовательских данных (cid, id)

и количество сканированных строк должно быть одинаковым для первого вейрия .. но таким образом вы избегаете второго ..

в конце концов попытайтесь создать составной индекс

 create index myidx1 on userdata(cid, id)
1 голос
/ 17 апреля 2019
UPDATE userdata SET maindata = (case when cid = id AND id = id2 then 1 else 0 end);

Это поможет.Я не уверен в вашем запросе, но это поможет.дайте мне знать, если вы ищете что-то другое ...

...