высокая пропускная способность для mysql, безопасные вставки? - PullRequest
0 голосов
/ 05 июня 2018

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

Например, скажем, я получаю 1000 строк данных в секунду, мне нужно перейти к примерно 100 различным таблицам (таким образом, 10 строк на таблицу в секунду).Я относительно новичок в этом масштабе данных в MySQL (особенно MariaDB).Прежде чем приступить к этому, нужно ли беспокоиться о такой быстрой записи в БД?Будет ли отставание / я могу потерять данные, которые не будут вставлены, если я получу другой запрос до того, как вставка будет завершена?Могу ли я сказать, пропускаю ли я какие-либо данные?

Я планировал написать на python, но могу приспособиться к C ++, если это будет проблемой (только если это будет проблемой, не обязательно просто для улучшения).Производительность).

Полный поток данных:

Обработчик веб-сокетов:

connect: wss: //..../streams? = stream1 & ..stream100

обратный вызов: @process_data (msg)

    def process_data(msg):
        #msg exp: {"table":"stream1", "v1":100, "v2":101, "v3":.000005, "v4":.0002} 
        connection.execute("""INSERT INTO {} 
                              VALUES ({}, {}, {}, {})
                           """.format(
                                      msg['table'], 
                                      msg['v1'],
                                      msg['v2'],
                                      msg['v3'],
                                      msg['v4']
                                     )
                           )

И я получаю около 1000 сообщений в секунду.

TL; DR: Я потеряю данные / испорчу эту настройку?Он работает на небольшой основе с двумя потоками (я думаю, но я не знаю, теряю ли я уже данные), но мне нужно значительно увеличить его.

Извините, если это глупый вопрос.

Редактировать: MyMaths! = "Good"

1 Ответ

0 голосов
/ 05 июня 2018

Основные издержки в MySQL, а не в Python или C ++, поэтому не меняйте язык приложения.

100 INSERTs / second - это отсечение, которое я использую - медленнее, чем в MySQL / MariaDB«просто работает из коробки».Быстрее, и вам может понадобится немного подправить.

Там, где это возможно, вы получите хороший импульс, вставив несколько строк в один оператор INSERT.Я думаю, что у Python есть специальный призыв к этому.Одновременная вставка 100 строк (в одну таблицу) выполняется примерно в 10 раз быстрее, чем одна строка на INSERT.

SSD может дать вам 10x.

Были тесты 1M/ сек - но это не для простых смертных на доступном оборудовании.

Есть несколько настраиваемых параметров, которые можно изменить для InnoDB.(innodb_flush_log_at_trx_commit=2, например).

Что касается «отсутствующих данных» - это вопрос к другой стороне вашего кода.Сторона MySQL просто получит здесь и здесь, если не сможет идти в ногу.

Я предполагаю, что в python есть хорошая библиотека для анализа JSON?

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

Почему там 100 столов?Если все таблицы по сути одинаковы, то это , вероятно, - "плохая" схема.

Создайте тестовую среду для стресс-тестирования вашего кода.Если вы получаете 2000 / сек, то код должен быть достаточно хорош для стабильной работы 1000 / сек.

Если вам нужно выйти за пределы 1000 / сек, см. http://mysql.rjweb.org/doc.php/staging_table

PS:1000/100 не равно 100.

...