Есть несколько проблем с бенчмаркингом INSERTs
.Скорость будет меняться по мере того, как вы будете вставлять все больше и больше, но это не будет легко предсказуемым образом.
Вставка выполняет (примерно) этот путь:
- Проверка на наличие дублированного ключа.У вас есть два уникальных ключа (ПК и УНИКАЛЬНЫЙ).Каждый BTree будет развернут для проверки на дублирование.Предполагая, что нет дублирования ...
- Строка будет вставлена в данные (BTree, назначенный PK)
- "Строка" будет вставлена в BTree каждого Уникального.В вашем случае есть BTree, эффективно упорядоченный по (column1, column2) и содержащий (id).
- Материал помещается в «буфер изменений» для каждого неуникального индекса.
Если у вас был AUTO_INCREMENT
или UUID
или ..., будет больше обсуждений.
Буфер изменений по сути является «отложенной записью» в неуникальные индексы.Эта задержка должна быть устранена в конце концов.То есть в какой-то момент все замедлится, если фоновый процесс не поспевает за изменениями.То есть, если вы вставите 1 миллион строк, вы не сможете достичь этого замедления;если вы вставите 10 миллионов строк, вы можете нажать на нее.
Другая переменная: VARCHAR(2048)
(и другие TEXT
и BLOB
столбцы) может или может не хранится "вне записи".Это зависит от размера строки, размера этого столбца и «формата строки».Большая строка может получить дополнительный удар по диску, тем самым замедляя тест, вероятно, на заметную величину.То есть, если вы проводите тестирование только с небольшими строками и определенными форматами строк, вы получите более быстрое время вставки, чем в противном случае.
И вам необходимо понять, как работает программа сравнения - по сравнению с тем, как будет работать ваше приложение:
- Вставка строк по одной в один поток, каждая из которых является транзакцией.
- Вставка строк по одной в один поток - партии, объединенные в транзакцию.
- Вставка 100 строк за раз в одном потоке в одной транзакции.
- ЗАГРУЗКА ДАННЫХ.
- Несколько потоков с каждым из перечисленных выше.
- Различные настройки изоляции транзакций.
- И т. Д.
(я не фанат тестов из-за того, сколько у них недостатков.) «Лучший» тест для сравнения оборудования или ограниченной схемыИзменения / app: захватить «общий журнал» из запущенного приложения;захватить базу данных в начале этого;время повторного применения этого журнала.
Разработка таблицы / вставки для вставленных строк по 50 КБ / с
- Минимизация индексов.В вашем случае все, что вам нужно, это
PRIMARY KEY(col1, col2)
;брось остальное;бросить id
.Пожалуйста, объясните, что такое col1 и col2;здесь могут быть и другие советы. - Избавьтесь от стола.Серьезно, рассмотрите возможность суммирования 50К строк каждую секунду и сохраняйте только суммирование.Если это практично, это значительно ускорит процесс.Или, может быть, стоит минута.
- Пакетная вставка строк каким-то образом.Детали здесь зависят от того, есть ли у вас один или несколько клиентов, выполняющих вставки, нужно ли обрабатывать данные по мере их поступления, и т. Д. Дополнительные обсуждения: http://mysql.rjweb.org/doc.php/staging_table
- Что находится в этих строках?Можно / нужно ли их «нормализовать»?
- Давайте обсудим математику.Будете ли вы загружать около 10 петабайт в год?У тебя так много места на диске?Что вы будете делать с данными?Сколько времени займет чтение даже небольшой части этих данных?Или это будет база данных «только для записи»?
- Больше математики.50K строк * 0.5KB = 25 МБ записи на диск в секунду.Какое устройство у вас есть?Может ли он справиться, скажем, в 2 раза?(С вашей исходной схемой это было бы больше как 60 МБ / с из-за всех индексов.)
После комментариев
Ладно, так больше похоже на 3 ТБ, прежде чем бросить данные и начать все сначала (через 2 часа)?Для этого я бы предложил PARTITION BY RANGE
и использовал бы некоторую функцию времени, которая дает вам 5 минут в каждом разделе.Это даст вам разумное количество разделов (около 25), а DROP PARTITION
будет отбрасывать только около 100 ГБ, что может не перегружать файловую систему.Дополнительные обсуждения: http://mysql.rjweb.org/doc.php/partitionmaint
Что касается строк ... Вы предлагаете 25 КБ, но объявления не позволяют так много ???