ОСНОВНІ КЛЮЧІ MySqlDump не впливають на імпорт


10

У мене є попереднє запитання щодо швидкості імпорту за допомогою Inno-Tables (сюрприз!).

Сценарій
Я намагаюся імпортувати якийсь великий дамп із бази даних * на мою локальну машину розробників у розумні строки. У нас багато KEYприкріплених до таблиць, які виявилися вузьким місцем, але все ще важливі для нашої живої системи.

Мій підхід після того, як ставити питання вище, полягав у видаленні KEY ...висловлювань із дамп, імпорту та повторного додавання ключів.

Однак я часто можу редагувати поточний дамп, щоб імпортувати його локально, і я натрапив на ці смішні "коментарі" (The disable/enable keys-lines)

--
-- Dumping data for table `monster`
--

LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT  INSERT  INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;

Але насправді ці "коментарі" є умовними MySql-Заявами

Це було новиною для мене, але гаразд, враховуючи форму випуску, для мене mysql --versionвсе виглядає нормально: mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3

Що я припускаю
Таблиця заблокована (прекрасно, це я лише на машині dev). Потім ключі, визначені в схемі таблиці, відключаються, дані імпортуються, ключі вмикаються.
Тому під час "вставки даних" -фаза не повинна витрачатися час на клавіші, а перевірятись після того, як всі дані будуть вставлені.

Я б думав, що це та ж поведінка, як якщо я KEY 'foo' (foo)'видаляю всі- рядки з дампа, імпортую дамп і запускаю сценарій ADD KEY 'foo' ...після цього.

Що я зауважую
Це набагато швидше вручну видалити ключі, імпортувати та повторно додавати ключі, а потім спираючись на умовні DISABLE KEYSзаяви, створені моїмиmysqldump

Ручне редагування дампа + імпорту mysql + додавання клавіш = 15 + 8 + 8 ≈ 30 хв.
Звичайний імпорт mysql: відмовлено, (мені щойно платять за 8 годин / день> :))

Я не можу не допомогти, але думаю, що тут я пропускаю щось дуже фундаментальне (або база даних мене тролює).


2
Короткий термін: використання mysqldump --innodb-optimize-keysвід Percona percona.com/doc/percona-server/5.5/management/… Довгостроковий: припиніть використання mysqldump та використовуйте mydumper або xtrabackup.
jynus

Відповіді:


12

Ви не можете покладатися на DISABLE KEYS;і ENABLE KEYS;для InnoDB , тому що вона не реалізована в InnoDB Storage Engine. Бігали ALTER TABLE ... DISABLE KEYS;і ALTER TABLE ... ENABLE KEYS;були розроблені для MyISAM. Як сказано в документаціїALTER TABLE на MySQL для :

Якщо ви використовуєте ALTER TABLE в таблиці MyISAM, всі індекси неоднозначності створюються в окремій партії (як для REPAIR TABLE). Це має зробити ALTER TABLE набагато швидшим, коли у вас є багато індексів.

Для таблиць MyISAM оновленням ключів можна керувати явним чином. Використовуйте ALTER TABLE ... ОСНОВНІ КЛЮЧІ, щоб сказати MySQL припинити оновлення невідповідних індексів. Потім використовуйте ALTER TABLE ... ENABLE KEYS, щоб відновити відсутні індекси. MyISAM робить це за допомогою спеціального алгоритму, який набагато швидше, ніж вставлення ключів по черзі, тому відключення ключів перед виконанням операцій масового введення повинно дати значне прискорення. Використання ALTER TABLE ... ОСНОВНІ КЛЮЧІ вимагає привілею INDEX, крім привілеїв, згаданих раніше.

У той час як індекси невідповідності відключені, вони ігноруються для операторів типу SELECT та EXPLAIN, які в іншому випадку будуть використовувати їх.

Ніколи не згадується про InnoDB в контексті ALTER TABLE ... DISABLE/ENABLE KEYS;

Навіть якщо ви ALTER TABLE ... DISABLE KEYS;стикаєтесь з таблицею InnoDB, вона генерує попередження:

mysql> show create table mytimes\G
*************************** 1. row ***************************
       Table: mytimes
Create Table: CREATE TABLE `mytimes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `totalTime` int(11) NOT NULL,
  `totalTimeDesc` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> alter table mytimes disable keys;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;
+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytimes' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

Ось чому ніякого афекту немає. Згадайте, що @jynus згадував те саме у своїй відповіді у пункті 7 .

Майте на увазі також, що MyISAM зберігає дані та індекси у двох окремих файлах (.MYD для даних, .MYI для індексів), тому було б тривіально відключити та включити індекси. InnoDB зберігає ПЕРШИЙ КЛЮЧ і дані про рядки на одних і тих же сторінках InnoDB (через кластерний індекс). Вторинні індекси містять ПЕРШИЙ КЛЮЧ як додаток до кожного другого запису аркуша індексу . Оскільки дані та індекси переплітаються через кластерний індекс, поки що ніхто не намагався реалізувати DISABLE KEYSі ENABLE KEYSв InnoDB.


1
"Я тобі сказав" :-)
jynus

@jynus HA HA :-). Ви можете залишити свій коментар mysqldump для InnoDB ( dba.stackexchange.com/questions/76565/… ) як відповідь.
RolandoMySQLDBA

@yoshi Я пишу статтю на основі вашого оригінального запитання, будьте в курсі.
jynus

@yosi Як обіцяв: dbahire.com/…
jynus

@RolandoMySQLDBA, Якщо InnoDB не може ввімкнути / вимкнути клавіші, чи не введено це помилку замість простого попередження?
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.