The auto-increment counter is stored only in main memory, not on disk.
Por causa disso, quando o serviço (ou servidor) reiniciar, ocorrerá o seguinte:
After a server startup, for the first insert into a table t, InnoDB executes the equivalent of this statement: SELECT MAX(ai_col) FROM t FOR UPDATE;
InnoDB increments by one the value retrieved by the statement and assigns it to the column and to the auto-increment counter for the table. If the table is empty, InnoDB uses the value 1.
Então, em inglês simples, depois que o serviço MySQL é iniciado, ele não tem idéia de qual deve ser o valor do incremento automático para sua tabela. Portanto, quando você insere uma linha pela primeira vez, ele encontra o valor máximo do campo que usa o incremento automático, adiciona 1 a esse valor e usa o valor resultante. Se não houver linhas, começará em 1.
Este foi um problema para nós, pois estávamos usando a tabela e o recurso de incremento automático do mysql para gerenciar IDs em um ambiente multi-thread onde os usuários estavam sendo redirecionados para um site de pagamento de terceiros. Então tivemos que nos certificar de que o ID que o terceiro recebeu e nos enviou de volta era único e assim permaneceria (e, claro, há a possibilidade de o usuário cancelar a transação depois de ter sido redirecionado).
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 a questão da maneira como o InnoDB lida com os valores da AI era 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 mais recente transactionId gerado como uma linha na tabela, sem desnecessariamente explodir a tabela.
Espero que ajude alguém que possa se deparar com isso.
Editar (2018-04-18) :
Como Finesse mencionou abaixo, parece que o comportamento disso foi modificado no MySQL 8.0+.
O texto desse log de trabalho é defeituoso na melhor das hipóteses, no entanto, parece que o InnoDB nessas versões mais recentes agora suporta valores de autoinc persistentes durante as reinicializações.
-Gremio