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