понедельник, 22 сентября 2008 г.

INNODB, INSERT ... SELECT и большие таблицы

В MySQL 5 (у меня версия 5.1.24-rc-log) при использовании движка INNODB существует проблема: если делаем INSERT INTO mytable SELECT ... FROM outhertable WHERE ... , и таблица, из которой SELECT - достаточно большая (миллионы записей), то после нескольких десятков секунд страдания появляется сообщение об ошибке: The total number of locks exceeds the lock table size
Есть два способа, как с этим бороться:
  1. по большому счету это не способ, а костыль, но если на машине сильная нехватка ОЗУ, то можно воспользоваться. Разделяем INSERT ... SELECT на два оператора - сперва делаем SELECT ... INTO OUTFILE 'tmpfilename', а потом LOAD DATA INFILE 'tmpfilename' INTO TABLE mytable Потом этот файл неплохо удалить - только следует учесть, что владелец у него - mysql, зато права доступа - еще интереснее - 0666 ;)
  2. вариант более нормальный - установить в /etc/my.cnf параметр innodb_buffer_pool_size=???M Документация утверждает, что значение может быть до 80% ОЗУ - то есть - кому сколько не жалко. У меня проблема не наблюдалась уже при 64 Мб. Значение по умолчанию (на платформе FreeBSD 7.0) - всего лишь 8 Мб. Просмотреть текущее значение этой переменной можно командой show variables like 'innodb_buf%';
Обсуждение этой ошибки на официальном сайте MySQL можно посмотреть тут (много английских букв)

Комментариев нет: