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.
![MySQL[Plus]](http://www.mysqlplus.fr/wp-content/uploads/2013/01/plus_logo_fr_mini.png)




