El contador de incremento automático se almacena solo en la memoria principal, no en el disco.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
Debido a esto, cuando el servicio (o servidor) se reinicia, sucederá lo siguiente:
Después del inicio del servidor, para la primera inserción en una tabla t, InnoDB ejecuta el equivalente de esta instrucción: SELECT MAX (ai_col) FROM t FOR UPDATE;
InnoDB incrementa en uno el valor recuperado por la instrucción y lo asigna a la columna y al contador de incremento automático para la tabla. Si la tabla está vacía, InnoDB usa el valor 1.
Entonces, en inglés simple, después de que se inicia el servicio MySQL, no tiene idea de cuál debería ser el valor de incremento automático para su tabla. Entonces, cuando inserta una fila por primera vez, encuentra el valor máximo del campo que usa el incremento automático, agrega 1 a este valor y usa el valor resultante. Si no hay filas, comenzará en 1.
Esto fue un problema para nosotros, ya que estábamos usando la tabla y la función de autoincremento de mysql para administrar perfectamente las identificaciones en un entorno de subprocesos múltiples donde los usuarios se redirigían a un sitio de pago de terceros. Así que teníamos que asegurarnos de que la identificación que el tercero nos envió y nos devolvió fuera única y que se mantuviera así (y, por supuesto, existe la posibilidad de que el usuario cancele la transacción después de haber sido redirigido).
Así que estábamos creando una fila, obteniendo el valor de incremento automático generado, eliminando la fila para mantener limpia la tabla y reenviando el valor al sitio de pago. Lo que terminamos haciendo para solucionar el problema de la forma en que InnoDB maneja los valores de AI fue lo siguiente:
$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);
Esto siempre mantiene el último Id. De transacción generado como una fila en la tabla, sin explotar innecesariamente la tabla.
Espero que ayude a cualquier otra persona que pueda encontrarse con esto.
Editar (2018-04-18) :
Como Finesse menciona a continuación, parece que el comportamiento de esto se ha modificado en MySQL 8.0+.
https://dev.mysql.com/worklog/task/?id=6204
La redacción de ese registro de trabajo es, en el mejor de los casos, defectuosa, sin embargo, parece que InnoDB en esas versiones más nuevas ahora admite valores de inclusión automática persistentes en todos los reinicios.
-Gremio