Обычно вы используете целые числа, а не varchars, потому что они занимают меньше места, хорошо понимают шаблон сортировки, быстро индексируются и т. Д. Целые числа являются естественными типами данных ЦП, и, следовательно, производительность в целом является оптимальной. Обычно целое число составляет 4 байта, что эквивалентно всего 4 символам в (не-Unicode) varchar.
Если вас беспокоит нехватка места с типом INT, попробуйте BIGINT, который даст вам 8-байтовые числа. Ограничение на это довольно велико, и вам, вероятно, не хватит места на диске, прежде чем вы достигнете этого предела записей :-) Производительность BIGINT также будет очень хорошей, особенно потому, что многие серверы теперь тоже 64-битные ,
Ответ на первую часть вашего вопроса о том, что происходит, когда вы заканчиваете в INT, не прост, особенно, как вы сказали, не меняя тип данных на BIGINT. По сути, вы мало что можете сделать, и то, что вы можете сделать, сильно ограничено характером данных в вашей базе данных. Какие записи имеют внешние ключи к этим данным? Вам все еще нужны все данные в этой таблице и связанные записи? Если предположить, что вы можете архивировать много исходных данных (и связанных с ними данных), то единственное, что я могу предложить, - это переместить данные из таблицы (скажем, от 1 до X миллионов записей), а затем сброс идентификатора идентификатора на 1. Существуют разные причины, хотя я бы не рекомендовал этого - например, я видел много битов кода, которые проверяют максимальное значение поля id, чтобы увидеть, что только что было добавлено, и это не сработает (и не должно быть сделано). Также люди предполагают, что запись N была создана до N + 1. Не простой ответ, я думаю.
Наконец, я не знаю о MySQL, но SQL Server выдаст ошибку переполнения, если вы достигнете предела.