У нас есть серия таблиц, которые выросли органически до нескольких миллионов строк в производстве, делающем вставку, или обновление может занять до двух секунд. Однако, если я вывожу таблицу и воссоздаю ее от запросов дампа, молния быстро.
Мы восстановили одну из таблиц путем создания копии, восстанавливающей индексы и затем делающей переименовать переключатель и копирующей по любым новым строкам, это работало, потому что та таблица только когда-либо добавляется к. Выполнение этого сделало молнию вставок и обновлений быстрой.
Мои вопросы:
То, почему делают, вставляет, становятся медленными со временем? Почему делает воссоздание таблицы, и выполнение импорта фиксируют это? Есть ли какой-либо способ, которым я могу восстановить индексы, не блокируя таблицу для обновлений?
Похоже, это либо
Вы можете попробовать проанализировать таблицу foo
, что не требует блокируется, всего несколько индексных погружений и занимает несколько секунд.
Если это не поможет, вы можете использовать
mysql> SET PROFILING=1;
mysql> INSERT INTO foo ($testdata);
mysql> show profile for QUERY 1;
, и вы увидите, на что тратится большая часть времени.
Очевидно, innodb работает лучше, когда вставки выполняются в порядке PK, это ваш случай?
Для обновления таблицы требуется перестроить индексы. Если вы выполняете массовые вставки, попробуйте выполнить их за одну транзакцию (как это делают дамп и восстановление). Если таблица настроена на запись, я бы все равно подумал об отбрасывании индексов или позволил бы фоновой задаче выполнять обработку чтения таблицы (например, путем копирования ее в индексированную).