Первичный ключ в MySQL: INT (n) или UUID как varchar (36) - PullRequest
5 голосов
/ 19 апреля 2010

Имеет ли смысл использовать UUID в качестве первичного ключа в MySQL?

Какие бы были плюсы и минусы использования UUID вместо обычного INT, помимо проблем ручного запроса?

Ответы [ 4 ]

7 голосов
/ 29 апреля 2012

С моей точки зрения, использование UUID в качестве первичного ключа в MySQL - плохая идея, если мы говорим о больших базах данных (и большом количестве вставок).

MySQL всегда создает первичные ключи как кластеризованные, и отключить его невозможно.

Принимая это во внимание, при вставке большого количества записей с непоследовательными идентификаторами (UUID) база данных фрагментируется, и каждая новая вставка занимает больше времени.

Совет: Используйте PostgreSQL / MS-SQL / Oracle с GUID. Для MySQL используйте int (bigints).

6 голосов
/ 19 апреля 2010

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

INSERT INTO table (uuidfield, someotherfield) VALUES (uuid(), 'test'));

не позволит вам увидеть, что представляет собой новое значение UUID, и, поскольку вы не используете обычный первичный ключ auto_incremented, вы не можете использовать last_insert_id() для его получения. Вы должны сделать это в два этапа:

SELECT @newuid := uuid();
INSERT INTO table (uuidfield, someotherfield) VALUES (@newuid, 'test');
INSERT INTO childtable ..... VALUES (@newuid, ....);
4 голосов
/ 19 апреля 2010

Недостатки UUID в том, что он громоздкий и, следовательно, немного медленнее для поиска. Трудно ввести длинную шестнадцатеричную строку для каждого специального запроса. Это решает проблему, которой у вас может не быть, то есть уникальность нескольких серверов.

Кстати, INT(n) всегда является 32-разрядным целым числом в MySQL, аргумент (n) не имеет ничего общего с размером или диапазоном допустимых значений. Это только подсказка ширины дисплея.

Если вам нужно целое число с диапазоном значений, превышающим 32-битный, используйте BIGINT.

4 голосов
/ 19 апреля 2010

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

Если вашей семантической таблице требуется эта функция, используйте UUID. В противном случае просто используйте простой INT ID (быстрее, проще для обработки, меньше).

...