01 Предисловие
Здравствуйте, давно не было обновлений. Потому что я недавно брал интервью. На подготовку ушло две недели и за 3 дня я получил 5 предложений.Наконец выбрал предложение от единорога в интернет-индустрии в Гуанчжоу.Я только вчера присоединился к компании. За последние несколько дней я просто разобрался с интересными вопросами, которые были заданы в интервью, а также воспользовался случаем, чтобы поделиться с вами.
Интервьюер этой компании оказался немного интересным, с одной стороны, младшим братом-ровесником, мы проболтали два часа (у меня пересохло во рту). Он задал мне намеренный (кенг) мысленный (б) вопрос:
Что делать, если в базе данных закончились автоматически увеличивающиеся идентификаторы?
Фактически эту проблему можно разделить наС первичным ключом и без первичного ключаОтветьте в обоих случаях.
Международная практика, сначала на карте мозга:
1.1 Прекрасное прошлое
Как выполняется оператор запроса 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.
На все вопросы интервью есть ответы, подробности таковы: бери, если надо,Абсолютно бесплатно, никаких процедур, чтобы получить.