mysql ОБНОВЛЕНИЕ несколько строк несколько ключей Эффективность - PullRequest
0 голосов
/ 06 ноября 2018

Я уже получил эту работу, однако я спрашиваю, могу ли я сделать это лучше (желательно как-то уменьшить количество всех условий в WHERE) или есть способ, который занимает меньше времени выполнения (хотя, похоже, это работает намного быстрее, чем зацикливание PHP каждого запроса на обновление).

Мне нужно обновить несколько строк (вероятно, будет 100-10000 раз в производстве) в таблице с 7 первичными ключами (да ... я почти в точке, где я хочу просто вставить один первичный ключ идентификатора на этом, но я должен был бы вернуться и перекодировать большую часть моей браузерной игры тогда ...) Я не могу использовать INSERT .. ON KEY DUPLICATE, потому что я не должен вставлять обновление, если оно больше не существует (выполняя некоторые УДАЛЕНИЯ на той же таблице непосредственно перед обновлениями)

Мое текущее решение:

UPDATE planet_market SET

amount = CASE
WHEN resource_id=1 AND type=0 AND price=2000 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=70 THEN 1
WHEN resource_id=1 AND type=0 AND price=2700 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=161 THEN 181
ELSE amount END

WHERE (resource_id=1 AND type=0 AND price=2000 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=70) OR (resource_id=1 AND type=0 AND price=2700 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=161)

Так есть ли лучший (более короткий запрос) или более быстрый (выполнение) способ сделать это?

1 Ответ

0 голосов
/ 06 ноября 2018

Ну, мне удалось найти способ значительно сократить запрос, хотя он работает примерно так же (я надеюсь ..., мое ограниченное тестирование, кажется, выполняет то же самое, пожалуйста, исправьте меня в этом), поэтому я пишу мой собственный ответ ...

Вот как (не обращайте внимания на немного отличающиеся данные, обратите внимание на изменение структуры):

UPDATE planet_market SET

amount = CASE
WHEN resource_id=3 AND type=0 AND price=2147483647 AND player_id=9 AND planet_id=2 AND owner_type=0 AND factory_id=-1 THEN amount + 1
WHEN resource_id=4 AND type=0 AND price=250000 AND player_id=8 AND planet_id=2 AND owner_type=0 AND factory_id=-1 THEN amount + 1
ELSE amount END

WHERE (resource_id, type, price, player_id, planet_id, owner_type, factory_id) IN ((3,0,2147483647,9,2,0,-1),(4,0,250000,8,2,0,-1))

Есть еще идеи?

Я надеюсь, что это поможет любому, кто ищет решение, подобное этому (я не смог найти никакой другой информации о стековом потоке об обновлении нескольких строк, когда у вас есть несколько ключей)

Интересно, смогу ли я сократить запрос, используя WHERE (column1, column2, ...) IN (data1, data2, ...) внутри WHEN THEN ... собираюсь проверить это дальше (я бы только сократил это при отсутствии "=" ... смеется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...