Как заменить первичный ключ новым столбцом с автоматически сгенерированными значениями в MySQL? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть таблица merchants со следующими столбцами: name, program_id, program_name. Текущий первичный ключ name + program_id

Что мне нужно сделать, так это добавить новый столбец id, заполнить его автоматически сгенерированными значениями (предпочтительно uuid или что-то в этом роде) и сделать его новым первичным ключом. .

Как это сделать?

1 Ответ

0 голосов
/ 06 августа 2020
ALTER table merchants DROP PRIMARY KEY, ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

если ваш движок базы данных - innodb, я предлагаю вам использовать целое число с автоматическим увеличением в качестве первичного ключа, а не uuid, потому что первичный ключ в innodb является кластеризованным индексом. Автоинкремент первичного ключа может уменьшить разделение страницы.

Обратите внимание, что не только вставка строк с первичным ключом UUID занимает больше времени, но и результирующие индексы немного больше. Отчасти это связано с большим первичным ключом, но некоторые из них, несомненно, связаны с разделением страниц и результирующей фрагментацией.

и минусы последовательного использования первичного ключа:

  • Целевая страница могла быть сброшена на диск и удалена из кешей, или могла никогда не быть помещена в кеши, и в этом случае InnoDB должен будет найти ее и прочитать с диска, прежде чем он сможет вставить новая строка. Это вызывает много случайных операций ввода-вывода.
  • Когда вставки выполняются не по порядку, InnoDB должен часто разделять страницы, чтобы освободить место для новых строк. Это требует перемещения большого количества данных и изменения как минимум трех страниц вместо одной.
  • Страницы становятся разреженными и неравномерно заполненными из-за разделения, поэтому окончательные данные фрагментированы.

Если вы хотите узнать больше о влиянии первичного ключа на разделение или объединение страниц, посетите здесь

...