Quand OPTIMIZE réinitialise l’auto-increment !

J’utilise la commande OPTIMIZE depuis longtemps, en particulier pour des problèmes d’espace disque.
Cette commande permet de réaliser une sorte de réorganisation de vos tables et index, pour MyISAM et InnoDB.
Et elle est particulièrement utile lorsqu’une table est vidée partiellement ou complètement afin de récupérer l’espace ainsi libéré (mais toujours occupé par le fichier physique sur disque).

J’ai récemment découvert un bug pouvant remettre en cause cette méthode pour certaines versions de MySQL (InnoDB), je vous laisse juger par vous même :

Création d’une table avec une colonne auto-incrémentée :

mysql> use test
Database changed
mysql> create table test_optimize (id int(8) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) engine=InnoDB;
Query OK, 0 rows affected (1.09 sec)
mysql> insert into test_optimize values (1),(2),(3),(4);
Query OK, 4 rows affected (0.28 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> show table status like ‘test_optimize’G
*************************** 1. row ***************************
Name: test_optimize
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 4
Avg_row_length: 4096
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 5
Create_time: 2011-07-12 10:21:28
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.02 sec)

4 lignes sont insérées dans cette table, l’auto incrément est à 5.

Suppression de toutes les lignes de la table puis OPTIMIZE :

mysql> delete from test_optimize;
Query OK, 4 rows affected (0.00 sec)
mysql> select count(*) from test_optimize;
+—————+
| count(*) |
+—————+
|        0 |
+—————+
1 row in set (0.00 sec)
mysql> optimize table test_optimize;
mysql> show table status like ‘test_optimize’G
*************************** 1. row ***************************
Name: test_optimize
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 1
Create_time: 2011-07-12 10:23:39
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

Suite à la suppression de toutes les lignes et le passage d’une commande OPTIMIZE, l’auto-incrément est repassé à la valeur 1 !
Il s’agit d’un bug référencé par MySQL pour InnoDB : http://bugs.mysql.com/bug.php?id=18274

Pour éviter ce problème, il sera nécessaire de passer aux versions suivantes de MySQL : 5.1.55, 5.5.9 ou 5.6.1

Je vous laisse juger des conséquences que peut avoir ce bug dans votre contexte.
N’hésitez pas à réagir et donner votre point de vue dans les commentaires.

Bonne semaine.