Интервьюер: Что происходит, когда заканчивается идентификатор автоинкремента базы данных?

Java задняя часть MySQL
Интервьюер: Что происходит, когда заканчивается идентификатор автоинкремента базы данных?

01 Предисловие

Здравствуйте, давно не было обновлений. Потому что я недавно брал интервью. На подготовку ушло две недели и за 3 дня я получил 5 предложений.Наконец выбрал предложение от единорога в интернет-индустрии в Гуанчжоу.Я только вчера присоединился к компании. За последние несколько дней я просто разобрался с интересными вопросами, которые были заданы в интервью, а также воспользовался случаем, чтобы поделиться с вами.

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

Что делать, если в базе данных закончились автоматически увеличивающиеся идентификаторы?

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

Международная практика, сначала на карте мозга:

1.1 Прекрасное прошлое

Как выполняется оператор запроса MySQL?

индексы MySQL

Логи MySQL

Транзакции MySQL и MVCC

Механизм блокировки MySQL

Как создать индекс для строк MySQL?

02 имеет первичный ключ

Если в вашей таблице есть первичный ключ, установите первичный ключ на автоинкремент.

В MySQL первичный ключ обычно имеет тип int. В MySQL тип int занимает 4 байта.Для бита со знаком диапазон равен [-2^31, 2^31-1], то есть [-2147483648, 2147483647], для бита без знака максимальное значение равно 2 ^32 -1, что равно 4294967295.

Следующее создает таблицу со знаковыми битами:

CREATE TABLE IF NOT EXISTS `t`(
   `id` INT(11) NOT NULL AUTO_INCREMENT,
   `url` VARCHAR(64) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

Вставьте значение, идентификатор которого является максимальным значением 2 147483647, как показано на следующем рисунке:

Если следующий оператор вставки продолжается в этой точке:

INSERT INTO t (url) VALUES ('wwww.javafish.top/article/erwt/spring')

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

2.1 Решения

Хотя int составляет 4 байта, максимальный объем данных может хранить 2,1 миллиарда. Вы можете почувствовать, что такая большая емкость не должна быть использована. Но в эпоху Интернета каждый день генерируется большое количество данных, что, скорее всего, будет достигнуто.

Итак, наше решение:Измените тип первичного ключа на bigint, который составляет 8 байт.. Максимальный объем данных, которые можно сохранить таким образом, составляет 2 ^ 64-1, и я не могу сосчитать, сколько. В любом случае, этого должно хватить на всю жизнь.

PS:Объем данных в 2,1 млрд в одной таблице явно нереалистичен, вообще говоря, когда объем данных достигает 5 млн, его следует разбивать на таблицы..

03 Нет первичного ключа

Другой случайПервичный ключ не был задан при создании таблицы. В этом случае InnoDB автоматически создаст для вас невидимый row_id длиной 6 байт (по умолчанию без знака, поэтому максимальная длина 2^48-1).

На самом деле InnoDB поддерживает глобальный dictsys.row_id, поэтомуТаблицы, которые не определяют первичный ключ, совместно используют row_id, а не одну таблицу. Каждый раз, когда вставляется часть данных, глобальный row_id рассматривается как идентификатор первичного ключа, а затем глобальный row_id увеличивается на 1.

Что произойдет, когда в этом случае закончится идентификатор автоинкремента базы данных?

1. Создайте таблицу t без настройки отображения первичного ключа:

CREATE TABLE IF NOT EXISTS `t`(
   `age` int(4) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. Пройтиps -ef|grep mysqlКоманда получает идентификатор процесса mysql, а затем выполняет команду, сначала изменяя row_id на 1 через gdb. PS: Если нет gdb, Baidu устанавливает его

sudo gdb -p 16111 -ex 'p dict_sys->row_id=1' -batch

Следующая картина кажется правильной:

3. Вставьте три элемента данных:

insert into t(age) values(1);
insert into t(age) values(2);
insert into t(age) values(3);

Данные базы данных на данный момент:

4. gdb изменяет row_id на максимальное значение: 281474976710656

sudo gdb -p 16111 -ex 'p dict_sys->row_id=281474976710656' -batch

5. Вставьте еще три элемента данных:

insert into t(age) values(4);
insert into t(age) values(5);
insert into t(age) values(6);

Данные базы данных по этому вопросу:

анализировать:

  • В начале row_id устанавливается равным 1, и row_id вставки трех данных 1, 2 и 3 также должен быть равен 1, 2 и 3; это не проблема.

  • Затем установите для row_id максимальное значение, а затем вставьте три фрагмента данных. Результаты базы данных в это время: 4, 5, 6, 3; вы обнаружите, что 1 и 2 перезаписаны.

  • Идентификаторы row_id вставленных значений 4, 5 и 6 после того, как row_id достигнет более позднего максимального значения, равны 0, 1 и 2 соответственно; поскольку значения row_id 1 и 2 уже существуют, последние значения 5 и 6 перезапишут значения row_id 1, 1 и 2. Значение 2.

Вывод: после того, как row_id достигнет максимального значения, он перезапустится с 0; данные, вставленные ранее, будут перезаписаны данными, вставленными позже, и об ошибке не будет сообщено.

04 Резюме

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

  • имеет первичный ключ,сообщить о конфликте первичного ключа
  • Без первичного ключа InnDB автоматически сгенерирует глобальный row_id. После того, как он достигнет максимального значения, он начнется с 0. Когда row_id тот же,Новые данные перезаписывают старые данные. Поэтому мы стараемсяУстановить первичный ключ для таблицы.

Почему я говорю, что это вопрос намерения (кэн) мышления (б)?

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

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

05 Справочные статьи

  • blog.csdn.net/weixin_39640090/article/details/113227742
  • blog.csdn.net/qq_35393693/article/details/100059966
  • time.geekbang.org/column/article/69862

06 Big Factory Интервью Вопросы и электронная книга

Если вы видите это и вам нравится эта статья, пожалуйста, помогитеНицца.

Когда мы впервые встретились, я не знал, что тебе подарить. просто отправьСотни электронных книги2021 последняя информация об интервьюБар. WeChat поискJavaFishОтветитьэлектронная книгаОтправляю вам более 1000 электронных книг по программированию; Ответитьинтервьюотправить несколько вопросов интервью; ответить1024Отправьте вам полный набор видеоуроков по Java.

На все вопросы интервью есть ответы, подробности таковы: бери, если надо,Абсолютно бесплатно, никаких процедур, чтобы получить.

面试题