Использование php mysql UPDATE CASE, где обновляемые поля различны для каждой строкиPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Использование php mysql UPDATE CASE, где обновляемые поля различны для каждой строки

Сообщение Anonymous »

КОНТЕКСТ:
У меня есть следующая таблица MySQL версии 8.

Код: Выделить всё

id  |   field1  | field2    |   ...... | field10    | timeStamp
_______________________________________________________________
fieldN имеет тип данных с плавающей запятой. id уникален и индексируется. Значения, которые должны войти в эту таблицу, генерируются различными узлами распределенной программы в сети. Различные узлы производят данные для одного или нескольких полей. В общей сложности у меня около 35 000 узлов, генерирующих данные каждую минуту, то есть около 600 входов в секунду.
(Примечание: вначале это был гораздо меньший набор узлов, который постепенно продолжал расти). В настоящее время для каждого запроса, поступающего от узла, я запускаю примерно такой запрос UPDATE.

Код: Выделить всё

Node 1 eg: UPDATE table set field1=24.5, field6=44.6,timeStamp=now() where id=1
Node 2 eg: UPDATE table set field3=53.3, field9=4.2, field10=98.8, timeStamp=now() where id=2
Node 3 eg: UPDATE table set field1=55.5, field8=7.2, field9=8.8, timeStamp=now() where id=3
и т. д. Итак, какие поля/количество обновляемых полей зависит от любого данного узла, как показано выше. Некоторые могут иметь данные для двух полей, некоторые - только для 1, некоторые даже для 5 или 6 и т. д.
ЗАДАЧА:
Чтобы уменьшить количество подключений/запросов к базе данных (в настоящее время по одному на каждый узел в минуту), я собираю все вместе, чтобы использовать Kafka для сбора всех этих обновлений, а затем запускаю их пакетами вместо отдельных запросов. >
Как только данные с различных узлов попадают в Kafka, я не уверен, как лучше поступить. Я немного почитал и наткнулся на следующие варианты.

Код: Выделить всё

1. Transactions,
2. CASE
3. MultiQuery.
Я использую докер. Я запустил тесты на основе тестового сценария (https://github.com/yanxurui/keepcoding/ ... update.php) и обнаружил, что этот метод CASE кажется самым быстрым. Хотя Multiquery, кажется, показывает наименьшее время выполнения с этим тестовым скриптом, похоже, что он просто сбрасывает все эти запросы в mysql, и MySQL занимает гораздо больше времени, чтобы фактически завершить запросы (как видно из статистики Docker). Принимая во внимание, что метод случая кажется более быстрым.
МОЕ РЕШЕНИЕ
После рассмотрения различных подходов, вот что я думаю.

Код: Выделить всё

UPDATE table set
field1= CASE    when id=1 THEN 24.5
when id=3 THEN 55.5
else field1
END,
field3= CASE    when id=2 THEN 53.3
else field3
END,
etc..,
timeStamp=now()
WHERE id IN (1,2,3,...)

Это означает, что для каждого поля в таблице мне придется перебирать список узлов, чтобы увидеть, есть ли у них значение, которое можно передать в это поле, и так далее.
ВОПРОСЫ

[*]Правильно ли я выбрал CASE-метод? Или я что-то пропустил в своих тестах?
[*]Если метод CASE — правильный путь, является ли мое решение правильным способом формирования запроса UPDATE?


Подробнее здесь: https://stackoverflow.com/questions/784 ... nt-for-eac
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»