Перетворення великого столу з MyISAM в Innodb


10

У мене є таблиця з приблизно 300М рядками у форматі MyISAM, яку я хочу перетворити на Innodb

Моєю первісною метою було зменшити використання, змінивши схему таблиці на більш прості індекси. Я скинув увесь стіл, скинув його, відтворив його з меншими показниками і зараз реімпортую. Однак я забув вказати, що це має бути innodb замість myisam.

Чи можу я просто зробити стандартну таблицю ALTER TABLE ... ENGINE = INNODB? Чи є щось особливе, про що я маю знати, настільки величезний стіл?

Операція імпорту даних займає близько 12 годин - я не люблю робити це ще раз. Звідси я хочу просто перетворити його.


З 300М рядками MyISAM, мабуть, швидше і краще підходить для таблиці такого розміру!
Марк Хендерсон

Відповіді:


14

Наступна робота вийшла з книги " Високопродуктивний MySQL, друге видання ".

Це відмінна книга, і я рекомендував би її будь-кому.

Коротка відповідь:

З огляду на розмір та умови вашого столу, незалежно від того, який метод ви виберете, я думаю, що ви потенційно можете довго чекати.


Перетворення таблиці

Існує кілька способів перетворення таблиці з одного двигуна зберігання в інший, кожен з яких має переваги та недоліки.

АЛЬТЕР ТАБЛИЦЯ

mysql> ALTER TABLE mytable ENGINE = Falcon;

Цей синтаксис працює для всіх механізмів зберігання даних, але є улов: це може зайняти багато часу. MySQL виконає по черзі копію вашої старої таблиці в нову таблицю. За цей час, ймовірно, ви будете використовувати всю ємність вводу / виводу диска сервера, і початкова таблиця буде зачитана під час читання конверсії.

Звалити та імпортувати

Щоб отримати більше контролю над процесом перетворення, ви можете спершу скинути таблицю в текстовий файл за допомогою утиліти mysqldump. Після того, як ви скинули таблицю, ви можете просто відредагувати файл дампа, щоб скорегувати вираз CREATE TABLE, який він містить. Не забудьте змінити назву таблиці, а також її тип, тому що у вас не може бути двох таблиць з тим самим іменем в одній базі даних, навіть якщо вони різного типу - і mysqldump за замовчуванням для написання команди DROP TABLE перед CREATE TABLE , тож ви можете втратити свої дані, якщо не будете обережні!

СТВОРИТИ І ВИБІРИ

Третя техніка перетворення - це компроміс між швидкістю першого механізму та безпекою другого. Замість того, щоб скидати всю таблицю або перетворювати її все одночасно, створіть нову таблицю та використовуйте синтаксис INSERT ... SELECT MySQL для її заповнення таким чином:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Це добре працює, якщо у вас не так багато даних, але, якщо у вас є, часто ефективніше поступово заповнювати таблицю, здійснюючи транзакції між кожним фрагментом, щоб журнали скасування не зростали величезними. Припускаючи, що id - це первинний ключ, запустіть цей запит повторно (використовуючи великі значення x і y кожен раз), поки ви не скопіюєте всі дані в нову таблицю:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Після цього вам залишиться оригінальна таблиця, яку ви можете скинути, коли закінчите з нею, та нова таблиця, яка зараз повністю заповнена. Будьте обережні, щоб заблокувати оригінальну таблицю, якщо потрібно, щоб не отримати непослідовну копію даних!


2

Оператор ALTER TABLE по суті робить те саме: сервер створює тимчасову таблицю, куди він копіює всі рядки, а потім робить RENAME. Формати на диску дуже різняться між InnoDB та MyISAM, тому я не сподіваюся, що ви знайдете якийсь ярлик до цього.

Ще одне зауваження (яке, можливо, ви знаєте, але це допоможе іншим читати це): формат на диску для InnoDB сильно залежить від первинного ключа, оскільки він кластеризує записи, засновані на ньому. Отже, працюючи з великими таблицями InnoDB, подумайте двічі, перш ніж вибирати первинний ключ, адже зміна його відновлює всю таблицю, подібно до проблеми, що існує.

У будь-якому випадку, я рекомендую зробити кілька тестів спочатку на таблиці з помірними розмірами, а також на тих, що пройшли час.


2
Будь-яка операція по зміні таблиці в MySQL (і що включає додавання індексів) перебудовує таблицю.
Девід Пашлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.