Mysql InnoDB слияния / копирования данных - PullRequest
0 голосов
/ 05 ноября 2010

У меня есть сценарий, где мне нужно сделать относительно большое количество вставок.Допустим, у меня миллионы строк в минуту ... которые вставляются в структурно идентичные таблицы, но с различными уровнями агрегации, применяемыми к данным.

Кроме того, чтобы снова получить доступ к этим данным, они довольно сильно проиндексированы,

Теперь, чтобы сделать вставки как можно быстрее, чтобы освободить время для другой обработки, я подумал о вставке в таблицу «DUMP», которая имеет точно такую ​​же структуру, но без индексов ...и затем запускает «процедуру слияния», которая будет ETL данных в индексированных таблицах агрегирования ... утверждая, что, поскольку все это происходит внутри базы данных, это должно быть быстрее, чем несколько раз протолкнуть его извне.

Однако простая «вставка в таблицу B select * from tableA» легко превосходит мой innodb_buffer_pool с блокировками строк, а затем выдает ошибку 1026.

Итак, наконец, вопрос: существует ли быстрый / надежный способ перемещения /объединение больших объемов данных из одной таблицы в другую?
Таблицы могут и, вероятно, будут разделены.Я предполагаю, что это желаемое мышление, что вы могли бы просто переместить раздел из одной таблицы в другую.
Если это «выбрать из вставки в», то, я думаю, будет безопаснее и проще просто вставить все это со стороны приложения..

1 Ответ

1 голос
/ 05 ноября 2010

Вы, конечно, можете вставить в промежуточную таблицу, а затем перенести строки. Это может в конечном итоге сделать больше работы для БД.

INSERT ... SELECT, безусловно, ваш друг, если вы хотите скопировать данные из одной таблицы в другую, это определенно будет быстрее, чем перемещение через клиента.

1M строк в минуту - это довольно много вставок, вам, безусловно, нужно будет тщательно построить приложение. Я предполагаю, что вы делаете это большими партиями (10000 строк, как правило, примерно правильно), но вы также должны помнить об уровне стойкости innodb (т.е. когда он мигает).

Отключение бинарника MySQL значительно уменьшает количество fsyncs (например, 50% в некоторых случаях), поэтому рекомендуется для рабочих нагрузок с очень высокой фиксацией. Вы также можете посмотреть на различные работы по настройке, выполненные третьими лицами. И, конечно же, используйте плагин, а не оригинальный innodb.


Под "Освободить время для другой обработки" вы имеете в виду своего клиента или свою базу данных? Если это ваш клиент, вам определенно следует вставлять асинхронно с другой работой - сохраняйте записи в памяти или на диске (но помните о долговечности этого хранилища), пока у вас не будет времени вставить их, вставляя их большими партиями.

...