перед - mysql vs postgresql benchmark



Что происходит, когда я исчерпываю ключ, созданный bigint? Как справиться с этим? (3)

Я не могу себе представить хороший ответ для этого, поэтому я подумал спросить здесь. Мне всегда интересно, что произойдет, если в моей таблице MySQL будет исчерпан столбец AUTO INCREMENT PRIMARY ID ?

Скажем, например, у меня есть таблица, которая имеет два столбца. Идентификатор ( auto increment, primary, BIGINT unsigned ) и DESC ( VARCHAR 255 ). Я точно знаю, что BIGINT много, но он может достичь своего предела. Как мне справиться со сценарием, когда ID достигает своего предела? Нужен ли мне другой сервер? Если тогда как я могу синхронизировать это? Это правильный путь? Любые идеи друзей.


Big int равен 2 ^ 63 или приблизительно 10 ^ 19 . Тесты базы данных были в моде несколько лет назад, используя стандартизированный тест TPC-C

Как вы можете видеть, самый быстрый реляционный счет - 30 000 000 (3x10 ^ 7 транзакций в минуту) для реляционной базы данных. Имейте в виду, что профиль будет включать много операций чтения, и очень маловероятно, что одна и та же система сможет записывать 30 000 000 строк в минуту.

Предполагая, что это так, вам понадобится примерно 3x10 ^ 11 минут, чтобы исчерпать BigInt. В измерении времени мы бы поняли, это что-то вроде 6 миллионов лет

ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

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


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

Когда вы достигнете этого предела в MySQL, вы получите загадочную ошибку, подобную этой:

Error: Duplicate entry '0' for key 1

Лучше использовать уникальный идентификатор или какую-то другую последовательность, которую вы генерируете. MySQL не поддерживает последовательности, но postgresql поддерживает.


Это не закончится.

Максимальный бигинт - 9223372036854775807. При 1000 вставках в секунду это 106751991167 дней. Почти 300 миллионов лет, если моя математика верна.

Даже если вы разделите его на части, используя смещения, где, скажем, 100 серверов имеют выделенный поддиапазон значений ( x*100+0 ... x*100+99 ), вы не закончите. 10000 машин, выполняющих 100 000 операций вставки в секунду, могут доставить вас туда примерно через три столетия. Конечно, это больше транзакций в секунду, чем на Нью-Йоркской фондовой бирже за сотни лет ...

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

CREATE TABLE bigserialtest ( id bigserial primary key, dummy text );
SELECT setval('bigserialtest_id_seq', 9223372036854775807);
INSERT INTO bigserialtest ( dummy ) VALUES ('spam');

ERROR:  nextval: reached maximum value of sequence "bigserialtest_id_seq" (9223372036854775807)

Для обычного serial вы получите другую ошибку, потому что sequence всегда 64-битная, так что вы достигнете точки, когда вам придется изменить тип ключа на bigint или получить ошибку вроде:

regress=# SELECT setval('serialtest_id_seq', 2147483647);
regress=# INSERT INTO serialtest (dummy) VALUES ('ham');
ERROR:  integer out of range

Если вы действительно уверены, что ваш сайт может достичь предела bigint в вашем приложении, вы можете использовать составной ключ - скажем (shard_id, subkey) - или ключ uuid.

Попытка справиться с этим в новом приложении - преждевременная оптимизация. Серьезно, от нового приложения до такого роста вы будете использовать ту же схему? Или движок базы данных? Или даже кодовая база?

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

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

Увидеть:

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





postgresql