Способы быстро разбить большой стол на осколки - PullRequest
3 голосов
/ 12 декабря 2011

Предположим, у меня большая таблица MySQL InnoDB (100 ГБ) и я хочу разделить эти данные между шардами.Таблицы выглядят так: Post(id: int, user_id: int, body: text, ...).Таблица сильно проиндексирована.Сервер размещен на AWS и использует диски EBS.

Разделение должно выполняться на основе ключа user_id.Например.сообщения пользователя с идентификатором 1..100 должны храниться на shard1, сообщения пользователя с идентификатором 101..200 должны храниться на shard2 и т. д.это займет до 5 дней.

Итак, есть ли идеи о том, как выплюнуть данные в разумные сроки?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

возможно, вы можете использовать хранимую процедуру, чтобы прочитать каждую запись и скопировать ее в разные фрагменты.

0 голосов
/ 11 октября 2013

Узким местом является скорость записи вашей дисковой подсистемы.

Хитрости для ускорения импорта:

MyISAM не транзакционный, поэтому намного быстрее в однопоточных вставках.Попробуйте загрузить в MyISAM, затем измените таблицу на INNODB. Используйте ALTER TABLE .. ОТКЛЮЧАЙТЕ КЛАВИШИ, чтобы построчно обновлять индекс (только MyISAM). Установите bulk_insert_buffer_size выше размера вставки (только MyISAM).проверено.

для дальнейшей настройки, пожалуйста, смотрите следующее: MYSQL Огромная вставка файлов SQL |Скорость MyISAM внезапно замедляется для вставок (странная проблема)

Примечание. Если исходная таблица имеет ограничения внешнего ключа, использование MyISAM в качестве промежуточного формата - плохая идея.

0 голосов
/ 13 декабря 2011

Скопируйте структуру таблицы, удалив все определения INDEX и используйте INSERT-SELECT для их заполнения.Как только вы закончите, используйте один оператор ALTER TABLE, чтобы добавить необходимые индексы.

...