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');

 

 

MariaDB  / Aria Formateur MariaDB Formateur MySQL InnoDB MariaDB MyIsam MySQL 

Commentaires

C’est marrant, j’ai fait le test chez moi hier suite à ton article sur une série de table avec des grosses requêtes pleines de jointure et de concaténation pour sortir du json avec pas mal de profondeur et les requêtes sur Aria sont toutes plus rapide que sur InnoDB avec les paramètres que tu montrais dans ton précédent article.
J’ai même essayé de peaufiner la conf de my.cnf avec mysqltuner après quelques heures de prod sur InnoDB et malgré tout, je n’arrive au mieux qu’à 20-25% de temps en plus que sur Aria.
Je reste donc sceptique sur le gain de vitesse avec InnoDB bien que certaines de ses fonctionnalités me serait bien utiles.

@KillyTheBid

T’as bien restarté l’instance après chaque batterie de tests ? T’as bien flushé le cache (RESET QUERY CACHE) ? Avais-tu des FK en InnoDB ?

Si tu es en mono-table, Aria reste plus performant que InnoDB. J’aurais peut-être dû faire une autre série de tests avec des clauses WHERE en mono-table et au niveau des jointures.

Je suis formel sur la qualité de mes tests.

NB Regarde bien dans /etc/my.cnf.d si tu ne te trimballes pas une conf par défaut qui viendrait écraser tes paramètres. Sur Fedora, les réglages sont à faire dans /etc/my.cnf.d/mariadb-server.cnf.

Laisser un commentaire

(requis)

(requis)