2009-03-31 3 views
9

Что делать, если у вас столько записей в таблице, что 2^32 недостаточно для вашего идентификатора auto_increment в течение определенного периода (день, неделя, месяц, ...)?
Что делать, если самый большой тип данных, предоставляемый MySQL, недостаточно?Что делать, если 2^32 просто недостаточно?

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

Как я мог встроить в MySQL (или любую другую систему) неограниченное количество уникальных идентификаторов или хотя бы увеличить его экспоненциально?

В идеале я хотел бы ожидать что-то вроде

> SELECT * FROM table; 

+---+------+ 
| a | b | 
+---+------+ 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
|...| .... | 
|...| .... | 
| 1 | 2^32 | 
| 2 | 1 | 
| 2 | 2 | 
+---+------+ 

экспоненциально увеличивает количество записей.

Как вы справляетесь с такими ситуациями?
Помните - требование - иметь уникальный идентификатор для любой записи.

+2

Хотите знать, какие данные потребуют таких высоких идентификаторов –

ответ

12

Вы можете использовать BIGINT для первичного ключа. По умолчанию это 64-разрядное число.

Редактировать # 2: По-видимому, я уже говорил об изменении длины байта BIGINT. BIGINT -, установленный на 8-байтовом пределе.

+0

http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html означает, что BIGINTs фиксированы в 8 байтах? –

+0

На самом деле то, что говорит Роуленд, верно - BIGINT всегда 64 бит. Число, которое может быть связано с числовыми типами данных, определяет только ширину отображения и не влияет на емкость хранилища. –

+0

Я смущен 8 байт и 64 бит - это то же самое? так что сыворотка редактировать? –

7

Просто используйте 128-битные ключи. Нет необходимости в неограниченном количестве ключей, так как вы очень быстро допускаете больше строк, чем число атомов во Вселенной. (где-то около 256 бит).

2

Не используйте автоинкрементом первичный ключ - использовать GUID или аналогичный - из статьи Википедии:

Хотя каждый генерируемой GUID не гарантированно быть уникальным, общее количество уникальных ключей (2^128 или 3.4 × 10^38) настолько велика, что вероятность того, что одно и то же число генерируется дважды, бесконечно мала. . Например, рассмотрим наблюдаемый универсум , который содержит около 5 × 1022 звезды; каждая звезда может , то есть 6.8 × 1015 универсально уникальный GUIDs.

+0

Не думал, что MySQL имеет встроенную поддержку GUID? –

+1

Затем получите RDMS, который может обрабатывать то, что вам нужно. – Eclipse

+3

Посмотрите «парадокс дня рождения». Фактически у вас будет 50% шанс получить один и тот же идентификатор GUID дважды в то время, когда вы создали 2^64 GUID. Таким образом, он не имеет преимущества перед использованием 64-битного автоинкрементного типа. –

0

Я не уверен, как их автоматически создавать в MySQL, а затем они не обязательно будут последовательными, но я уверен, что вы можете использовать GUID и не беспокоиться о том, что они заполняют вверх.

5

Я бы начал с перехода на BIGINT для 2^64. GUID были бы еще одним вариантом, но вам нужно сохранить их самостоятельно в «некоторой форме»

0

Вы также можете использовать символы/varchars для своих ключевых столбцов и использовать GUID для своих ключей. Я не знаю, будет ли это повлечь за собой штраф за производительность по сравнению с целыми первичными ключами.

1

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

Как уже говорилось ранее, наилучшим выбором для наборов данных VAST является либо GUID (если ваша RDBMS поддерживает его изначально), либо varchar (16).

Приятная часть использования varchar/varbinary заключается в том, что вы можете автоматически расширять столбец в будущем, если это необходимо. И плохая часть состоит в том, что varchar/varbinary - плохо выполняющий ключ, по сравнению с целым числом.

7

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

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

15

Вам не кажется, что BIGINT UNSIGNED будет достаточным? Это диапазон от 0 до 18.446.744.073.709.551.615 или один год с 50.539.024.859.478.223 вводами в день (365 d/y), 2.105.792.702.478.259 записей в час, 35.096.545.041.304 записей в минуту или 584,942,417,355 в секунду.

With assumed 600 writes per second (without any reads) Вы можете писать записи 974.904.028 лет при полной скорости записи. Этого должно быть достаточно.

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