O contador de incremento automático é armazenado apenas na memória principal, não no disco.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
Por isso, quando o serviço (ou servidor) reiniciar, acontecerá o seguinte:
Após a inicialização do servidor, para a primeira inserção em uma tabela t, o InnoDB executa o equivalente a esta instrução: SELECT MAX (ai_col) FROM t FOR UPDATE;
O InnoDB incrementa em um o valor recuperado pela instrução e o atribui à coluna e ao contador de incremento automático da tabela. Se a tabela estiver vazia, o InnoDB utilizará o valor 1.
Portanto, em inglês simples, após o início do serviço MySQL, ele não tem idéia do valor do incremento automático para sua tabela. Portanto, quando você insere uma linha pela primeira vez, ela encontra o valor máximo do campo que usa incremento automático, adiciona 1 a esse valor e usa o valor resultante. Se não houver linhas, começará em 1.
Isso foi um problema para nós, pois estávamos usando o recurso de incremento automático da tabela e do mysql para gerenciar ordenadamente os IDs em um ambiente multithread em que os usuários estavam sendo redirecionados para um site de pagamento de terceiros. Portanto, tivemos que garantir que o ID que o terceiro recebesse e nos enviasse de volta fosse único e continuasse assim (e, é claro, existe a possibilidade de o usuário cancelar a transação após o redirecionamento).
Então, estávamos criando uma linha, obtendo o valor de incremento automático gerado, excluindo a linha para manter a tabela limpa e encaminhando o valor para o site de pagamento. O que acabamos fazendo para corrigir o problema da maneira como o InnoDB lida com os valores de IA foi o seguinte:
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
Isso sempre mantém o transactionId mais recente gerado como uma linha na tabela, sem explodir desnecessariamente a tabela.
Espero que ajude qualquer pessoa que possa se deparar com isso.
Editar (2018-04-18) :
Como Finesse mencionado abaixo, parece que o comportamento disso foi modificado no MySQL 8.0+.
https://dev.mysql.com/worklog/task/?id=6204
A redação desse log de trabalho está com falhas, na melhor das hipóteses, no entanto, parece que o InnoDB nessas versões mais recentes agora suporta valores persistentes de autoinc durante as reinicializações.
-Grêmio