Как экспортировать огромную таблицу MyISAM в InnoDB кусками? - PullRequest
0 голосов
/ 04 августа 2011

Я использую MySQL Workbench, чтобы изменить некоторые огромные (миллионы строк) таблицы MyISAM на InnoDB. Я попробовал его по ALTER TABLE... и INSERT INTO othertable SELECT * FROM mytable после клонирования таблицы, но кажется, что таблицы слишком большие. Верстак завершает работу с ошибкой о потерянном соединении с сервером ... .

Поэтому я подумал, что мог бы написать сценарий SQL, который зацикливается на каждой записи 10000 или около того и копировать содержимое таблицы MyISAM порциями в таблицу InnoDB.

Поскольку, похоже, нет циклов for SQL, мне интересно, есть ли у кого-нибудь предложения, как это реализовать?

INSERT INTO `latest`.`AUTHORS` (author_id, author_name)
SELECT
`author_names`.`author_name_id`,
`author_names`.`name`
FROM `pubmap_latest`.`dblp_author_names`;

Это запрос, который я хочу выполнить кусками. Запрос count(*) возвращает 985330 строк.

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Я бы использовал mysqldump (инструмент командной строки), чтобы экспортировать данные из старой таблицы, а затем импортировать их в новую таблицу. Что-то вроде:

mysqldump database table > file.sql

Затем отредактируйте имя таблицы и введите файл и:

mysql database < file.sql

0 голосов
/ 04 августа 2011

В MySQL вы можете использовать ключевое слово LIMIT в операторах SELECT, определяющее, сколько строк результата вы хотите отобразить.Комбинируя это со смещением, вы можете разбить ваш стол на куски.Конечно, вы должны использовать предложение order by для работы с одним и тем же набором результатов при разбиении таблицы на куски.

SELECT `author_names`.`author_name_id`, `author_names`.`name`
FROM `pubmap_latest`.`dblp_author_names`
ORDER BY  `author_names`.`author_name_id`
LIMIT 10000 OFFSET 0
INTO OUTFILE dblp_author_names_0.sql

Для смещения вы должны использовать 10000, 20000, 30000, ...

Загрузите результаты с помощью

LOAD DATA INFILE ...

См. Справочное руководство MySQL 5.1 .

...