2011-05-05 2 views
0

Я только что закончил создание новой секционированной таблицы, чтобы заменить старую, не разбитую секционированную таблицу (переименованную для сохранения). Я скопировал новейшие данные из старой таблицы в новую таблицу в то время, когда я ее создал, но у меня все еще есть примерно половина данных, оставшихся для копирования. Проблема в том, что в реальном времени веб-сервис забивается безостановочно, и каждый раз, когда я пытаюсь скопировать фрагмент через INSERT..SELECT, он настаивает на том, чтобы делать это как атомную транзакцию (которая потребляет все ресурсы сервера, замедляет все до сканирование и, вероятно, толкает сервер, опасно близкий к исчерпанию физических ресурсов).Вставить..Выберите в таблицу InnoDB с фиксацией после каждой вставки?

Просто, чтобы быть ясным: OldTable - MyISAM. NewTable является InnoDB и разбивается по диапазону на его первичный ключ 'a'. Обе таблицы имеют одинаковые имена полей. Сами поля не идентичны, но там, где они различаются, поля в NewTable больше.

Запрос, который вызывает проблемы выглядит следующим образом:

INSERT INTO NewTable (a,b,c,d,e,f,g) 
SELECT a,b,c,d,e,f,g 
FROM OldTable 
WHERE a > 300000000 AND a <= 400000000 
order by a 

То, что я хотел бы, чтобы это сделать: либо совершить после каждой вставки, или просто обойтись без транзакционной целостности полностью и позволяют грязного чтения произойдет, если они бывает.

Блокировка NewTable (кроме, возможно, одной вставленной строки) неприемлема. Блокировка OldTable в порядке, потому что больше ничего не использует, во всяком случае (кроме SQL, чтобы скопировать его в новую таблицу, конечно).

Кроме того, есть ли способ сказать MySQL сделать это с наименьшим возможным приоритетом и только работать над задачей в ее (относительном) свободном времени?

+0

Если вы хотите совершить RBAR (Row By Agonizing Row), вам нужен курсор. –

+0

Есть ли какой-либо компромисс между группами? Как, может быть, MySQL совершает каждые сто или тысячи строк? Это не LITERALLY нужно сделать после одной строки ... Я просто не хочу ждать, пока он настаивает на попытке сделать миллион строк в один глоток, и слишком много общих строк, которые все еще имеют для перемещения их в куски размером менее миллиона, если я копирую его из текстового редактора и вставляя его в клиент MySQL командной строки. – Bitbang3r

+0

Я еще не столкнулся с синтаксисом SQL, который позволяет указать произвольное число для массовой вставки/обновления. –

ответ

1

В дополнение к уменьшению количества вставленных строк за раз, попробуйте увеличить системную переменную bulk_insert_buffer_size к чему-то более подходящему для вашего случая? Значение по умолчанию - 8 МБ.

Смежные вопросы