Ускорьте вставки MySQL с разделами на MyISAM с уникальным ключом
9
У меня есть большая таблица MyISAM (~ 30 миллионов строк). В какой-то момент я переключил его на фиксированный формат строки, поэтому теперь таблица занимает ~ 40 ГБ на диске и 2 ГБ для индексов. Таблица имеет уникальный индекс, и в секунду выполняется 100 запросов на вставку при обновлении дублированного ключа. По мере роста таблицы эти вставки становятся все медленнее и медленнее.
Я не уверен, но помогут ли разделы ускорить вставку?
Во-первых, параллельные записи определенно не подходят для хранилища MyISAM. Каждый из них заблокирует всю таблицу (за исключением чтения в некоторых случаях). Если InnoDB вам не подходит, попробуйте TokuDB. Но это будет медленнее по сравнению с MyISAM из-за транзакционной природы движка TokuDB (и, конечно, InnoDB) (вы должны записывать одни и те же данные как минимум дважды: журнал и файлы данных). Кроме того, если ваш сервер когда-нибудь выйдет из строя, вы будете часами ждать восстановления таблицы MyISAM 40 Гб.
Если вы по-прежнему хотите загружать данные в свои MyISAM-таблицы и хотите делать это быстро, я могу рекомендовать использовать LOAD DATA INFILEвместо вставок. Это самый быстрый способ загрузки больших объемов данных в таблицу. И да, индексы будут снижать производительность вставки в геометрической прогрессии.
Несколько слов о разделах: INSERT-операторы в MySQL не поддерживают сокращение, поэтому все ваши разделы будут проверяться для каждого оператора на предмет уникального соответствия индекса. Кроме того, все разделы будут заблокированы до окончания вставки.
Являются ли эти запросы вставки параллельными или исходящими из одного и того же процесса? Если они параллельны, лучше использовать хранилище InnoDB для этой таблицы, потому что MyISAM блокирует всю таблицу, а InnoDB использует блокировки строк. Если переключение на другое хранилище не вариант, вы можете попробовать оператор INSERT DELAYED и ряд других оптимизаций вставки . Разбиение не поможет, если вы не разместите разные разделы на разных физических дисках.
Эти вставки являются одновременными. Но InnoDB слишком медленно выполняет «вставку при обновлении дублированного ключа», поэтому это не вариант. Насколько я могу судить, IO не является узким местом - объем оперативной памяти >> размер таблиц, включая индексы и кэширование записи, включен. Я думаю, что проблема лежит где-то во внутренних замках mysql или что-то.
d0rc
INSERT DELAYED следует использовать только для операторов INSERT, которые указывают списки значений. Сервер игнорирует DELAYED для операторов INSERT ... SELECT или INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro
«InnoDB слишком медленный» - вы пробовали немного его настроить? Настройки по умолчанию довольно плохие.
Являются ли эти запросы вставки параллельными или исходящими из одного и того же процесса? Если они параллельны, лучше использовать хранилище InnoDB для этой таблицы, потому что MyISAM блокирует всю таблицу, а InnoDB использует блокировки строк. Если переключение на другое хранилище не вариант, вы можете попробовать оператор INSERT DELAYED и ряд других оптимизаций вставки . Разбиение не поможет, если вы не разместите разные разделы на разных физических дисках.
источник