2017-01-13 2 views
0

У меня есть таблица в базе данных MariaDB, для которой не задан первичный ключ. Однако он имеет индекс. Я хотел бы добавить первичный ключ с тем же определением, что и этот индекс. Наивный способ может быть:Содействовать индексу первичному ключу

alter table `foo` add primary key (`bar`, `baz`), 
        drop index `qux`; 

... но это займет очень много времени и кажется расточительным. (Таблица имеет размер в десятки гигабайт и работает на машине с меньшим свободным дисковым пространством, чем общий размер таблицы.) Я понимаю, что индекс и первичный ключ - это не одно и то же (по крайней мере, первичный ключ включает ограничение уникальности, которое должно быть проверено во время процесса создания), но есть ли способ использовать индекс для «начальной загрузки» первичного ключа?

+0

Является ли 'qux' 'именем' индекса на' (bar, baz) '? –

ответ

0

Предполагая, что таблица является ENGINE=InnoDB ?? ...

Если не хватает свободного места на диске для другой копии таблицы, задача не может быть выполнена без помощи второго сервера. Можете ли вы опустить несколько таблиц? Или иначе освободить место?

A PRIMARY KEY является UNIQUE и является индексом. Если комбинация bar и baz не уникальна, вы не должны превращать ее в ПК.

Использование ПК для поиска одной строки выполняется быстрее, чем использование вторичного индекса. Это связано с тем, что он сначала ищет строку в BTree вторичного индекса. Там он находит PRIMARY KEY, который затем используется для поиска строки в BTree данных.

Если таблица больше, чем innodb_buffer_pool_size, ваше изменение также (во многих случаях) устранит попадание диска. (Диск-хиты являются самой медленной частью операций с базой данных.)

Да, в вашем распоряжении PRIMARY KEY. Это 6-байтовый скрытый «столбец». Ваш ALTER отбросит это, тем самым сделав таблицу немного меньшей (еще одно небольшое преимущество).

У вас есть innodb_file_per_table=ON (or = 1)? Если таблица находится в своем собственном .ibd-файле, вы восстановите дисковое пространство после операции (при условии, что она может работать вообще). С OFF он увеличит размер файла ibdata1, но не сможет его сжать. У вас есть ON при создании таблиц, которые в конечном итоге будут «большими».

OK, есть may будьте на надежды. Если вы работаете с OFF, и, то достаточно места в ibdata1, тогда задача может быть завершена. (Но это означает, что, как и в предыдущем случае, вы уже раздули ibdata1.)

Смежные вопросы