За последние 24 часа нас посетили 8724 программиста и 457 роботов. Сейчас ищут 128 программистов ...

Массовые обновления строк

Тема в разделе "MySQL", создана пользователем IvanKut, 28 июл 2020.

  1. IvanKut

    IvanKut Новичок

    С нами с:
    27 июл 2018
    Сообщения:
    197
    Симпатии:
    0
    Привет
    Ребят посоветуйте, у нас каждую секунду прилетают JSON пакеты с данными по меткам(какая антена где их увидела)
    В пакете по 1000-5000 меток может быть и мы делаем такие update
    Код (Text):
    1. UPDATE `sRfid_epc` SET `dateLast`='2020-07-28 17:31:16' WHERE `id`=956638
    Дата у каждой метки разная. Итог под 5000 update-ов может быть на пакет.
    Вопрос, какие-то есть техники подготовки update чтобы они быстрей проходили? Может можно как-то bulk запрос сделать, чтобы ускорить обновление?

    Благодарю
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.548
    Симпатии:
    1.040
    Адрес:
    Лень
    update всегда медленнее чем delete + insert. Поправьте, если мое мнение устарело.
     
  3. IvanKut

    IvanKut Новичок

    С нами с:
    27 июл 2018
    Сообщения:
    197
    Симпатии:
    0
    @MouseZver мне почему-то кажется, что как-то можно делать обновления не по одному - а сразу пачкой. Ведь на каждый update выполняемый в одиночку куча времени тратиться на операции до/после - если смотреть на профайлер.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.548
    Симпатии:
    1.040
    Адрес:
    Лень
    можно запрос сделать + виртуально выдать инфу, а после демон-скрипт сам подберет и обновит физически
     
  5. IvanKut

    IvanKut Новичок

    С нами с:
    27 июл 2018
    Сообщения:
    197
    Симпатии:
    0
    @MouseZver вообще ничего не понял.
    Я обновляю не в риал тайме, раз в минуту кроном(то есть метки летят каждую секунду, я собираю большую пачку) и бегусь одним проходом все обновляю.

    "запрос сделать + виртуально выдать инфу"
    Вот это не понимаю
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.548
    Симпатии:
    1.040
    Адрес:
    Лень
    Тоесть, если ожидается ответ, то расчитать/минусовать и т.д. выдать сейчас, а реально в бд - сделать потом.
     
  7. IvanKut

    IvanKut Новичок

    С нами с:
    27 июл 2018
    Сообщения:
    197
    Симпатии:
    0
    @MouseZver индексы все есть естественно. Обновление идет по primary индексу.

    Код (Text):
    1. UPDATE `sRfid_epc` SET `dateLast`='2020-07-28 17:31:16' WHERE `id`=956638
    Тут тупо запрос на обновление даты) Но их 5000 тысяч за запуск может быть:)
    Вот я и думал, может есть какая-то фишечка подготовить массовый запрос и отправить его как один)
     
  8. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.253
    Симпатии:
    281
    @IvanKut, может действительно стоит сделать отдельную таблицу (id-метки, dateLast) и выполнять delete+insert по набору дат для меток к пакете?
    Таким образом будут в наличии таблица меток с их атрибутами, накопительная таблица с датами и таблица с "dateLast" для меток...
    В выборках, соответственно, join с последней таблицей, а если метки там нет - искать в накопительной.
     
  9. IvanKut

    IvanKut Новичок

    С нами с:
    27 июл 2018
    Сообщения:
    197
    Симпатии:
    0
    @Sail попробуемс. спс
     
  10. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.253
    Симпатии:
    281
    @IvanKut, кстати, много операций обновления, завернутых в одну транзакцию выполняются гораздо быстрее, чем по отдельности...
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.321
    Симпатии:
    1.033
    Адрес:
    там-сям
    1. Канонический подход — подготовленный запрос UPDATE и в цикле вызов с новыми параметрами.

    2. INSERT ON DUPLICATE KEY UPDATE. Делаешь вставку пачкой, инсерт в отличие от апдейта такое умеет, но после обнаружения дубля применяется правило обновления.

    https://stackoverflow.com/q/35726910/272885