Retour vers InnoDB
Si le passage de MyISAM à Aria me fut salutaire grâce à une gestion de verrous autorisant les UPDATE et DELETE concurrents là où MyISAM pose des verrous sur table, je n’avais pas regardé véritablement du côté des performances. Or, lors de la formation Tuning MySQL / MariaDB donnée il y a 15 jours, les temps que nous avons remontés nous ont montré que Aria était plus lent que MyISAM dans le cadre d’une requête sur une seule table. Hier, j’ai étendu l’analyse en comparant les performances respectives de MyISAM, Aria et InnoDB. Le verdict fut sans appel : c’est InnoDB, dans le cadre du fonctionnement normal d’une base de données qui offre la plus grande performance ! Je l’ai vérifié dans le cadre de mon serveur Dedibox sur lequel s’exécute un moteur MariaDB 10.2.12. J’ai donc décidé de retourner à InnoDB, par l’écriture de cette procédure stockée.
Conversion des tables Aria en InnoDB.
La procédure stockée nommée aria2innodb – présentée ci-dessous – ne doit pas s’appliquer aux schémas mysql, information_schema et performance_schema. Le paramètre paramSchema représente la base de données, dans laquelle se trouvent les tables à convertir !
DELIMITER // CREATE PROCEDURE aria2innodb ( paramSchema VARCHAR(255)) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE strSchema,strTable VARCHAR(255); DECLARE curAria CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE ENGINE IN ('Aria') AND table_schema IN (paramSchema); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN curAria; read_loop: LOOP FETCH curAria INTO strSchema,strTable; IF done THEN LEAVE read_loop; END IF; SET @s=strSchema; SET @t=strTable; /* PREPARE stmt FROM "ALTER TABLE ?.? ENGINE=MyISAM"; EXECUTE stmt USING @s,@t ; */ SET @sql=CONCAT('ALTER TABLE `',@s,'`.`',@t,'` ENGINE=InnoDB'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE curAria; END; // DELIMITER ;
Exécution de la procédure stockée aria2innodb
Remplacez ma_base_a_convertir par le nom de la base de données à convertir.
CALL aria2innodb('ma_base_a_convertir');