MySQL InnoDB блокировка строки / таблицы при выполнении ALTER - PullRequest
0 голосов
/ 20 марта 2019

Я создал таблицу sysbench, показанную ниже, с 25 000 000 записей (размером 5,7 ГБ):

Create Table: CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=25000001 DEFAULT CHARSET=latin1

Затем добавил индекс на c, используя непосредственно оператор ALTER, что потребовало около 18 минут для обновления таблицыкак показано ниже:

mysql> alter table sbtest1  add index c_1(c);
Query OK, 0 rows affected (18 min 47.32 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table sbtest1\G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`),
  KEY `c_1` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=25000002 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

В течение 18 минут процесса обновления таблицы я пытался выполнить некоторые транзакции с таблицей, вставляя новые записи, а также обновляя существующие записи в столбце c, и которые, к моему удивлению,все работало, когда я ожидал блокировки, чтобы предотвратить это.Я всегда понимал, что выполнение ALTER для таблицы InnoDB, особенно для большой таблицы, может привести к блокировке записи на время процесса, поэтому мне было интересно, почему я смог выполнить вставки и обновления без проблем?

Вот некоторая информация о моем сервере:

mysql> show variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation          | REPEATABLE-READ |
+-----------------------+-----------------+

mysql> select version()
    -> ;
+-----------+
| version() |
+-----------+
| 5.7.25-28 |
+-----------+

Теперь мне кажется, что в MySQL 5.7 нормально выполнять оператор ALTER, не беспокоясь о блокировках?Это точный вывод?

ОБНОВЛЕН Когда я попытался удалить добавленный индекс c_1, это заняло менее секунды, что также удивило меня, потому что я ожидал, что это займет больше времени, чем на самом деледобавление индекса.Я всегда считал, что добавить индекс просто и быстро, но его удаление или обновление занимает много времени, так как необходимо изменить всю структуру таблицы.Так что немного запутался об этом ???

1 Ответ

1 голос
/ 20 марта 2019

Добавление вторичного индекса можно сделать на месте и разрешить одновременный DML.

...