Anteriorment, vam explicar com actualitzar la teva base de dades a MariaDB 10.4, solucionant els problemes de performance que sorgien durant el procés. En aquest article, t’explicarem un altre problema que pots trobar-te amb aquesta base de dades. Concretament, quan s’associa amb Magento.

Si estàs utilitzant la plataforma Magento i has instal·lat MariaDB 10.4, pot ser que t’hagis adonat que quan Magento llança les consultes a la base de dades, aquesta triga massa a retornar el resultat. Això es tradueix en un encolament de queries i, per consegüent, en un coll d’ampolla que pot incrementar el percentatge de CPU ocupada.

Fins aquí, cap problema, però només si tenim accés a la configuració de la base de dades (my.cnf).

Si es tracta d’un servei gestionat, com les RDS de Amazon Web Services, aquest camp no es pot modificar des dels parameter groups, ja que aquest paràmetre no existeix.

Si intentem setejarlo, la consola ens retornarà el següent error:

“Error saving: Invalid parameter value: rowid_filter=off for: optimizer_switch allowed values are: condition_pushdown_for_derived=on,condition_pushdown_for_derived=off,condition_pushdown_for_subquery=on,condition_pushdown_for_subquery=off,default,derived_merge=on,derived_merge=off,derived_with_keys=on,derived_with_keys=off,engine_condition_pushdown=on,engine_condition_pushdown=off,exists_to_in=on,exists_to_in=off,extended_keys=on,extended_keys=off,firstmatch=on,firstmatch=off,index_condition_pushdown=on,index_condition_pushdown=off,index_merge=on,index_merge=off,index_merge_intersection=on,index_merge_intersection=off,index_merge_sort_intersection=on,index_merge_sort_intersection=off,index_merge_sort_union=on,index_merge_sort_union=off,index_merge_union=on,index_merge_union=off,in_to_exists=on,in_to_exists=off,join_cache_bka=on,join_cache_bka=off,join_cache_hashed=on,join_cache_hashed=off,join_cache_incremental=on,join_cache_incremental=off,loosescan=on,loosescan=off,materialization=on,materialization=off,mrr=on,mrr=off,mrr_cost_based=on,mrr_cost_based=off,mrr_sort_keys=on,mrr_sort_keys=off,optimize_join_buffer_size=on,optimize_join_buffer_size=off,orderby_uses_equalities=on,orderby_uses_equalities=off,outer_join_with_cache=on,outer_join_with_cache=off,partial_match_rowid_merge=on,partial_match_rowid_merge=off,partial_match_table_scan=on,partial_match_table_scan=off,semijoin=on,semijoin=off,semijoin_with_cache=on,semijoin_with_cache=off,subquery_cache=on,subquery_cache=off,table_elimination=on,table_elimination=off (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 8f122be0-66b6-4034-b898-64e5a0106ce3; Proxy: null)”

Aquesta variable es pot setejar amb el paràmetre indicat des de la mateixa Command Line de MySQL, però només a nivell de sessió, així que modificar-ho a mà per a cada sessió es fa insostenible.

Com workaround, decidim crear un procedure per a modificar aquesta variable i que aquest procedure sigui invocat per la funció init_connect amb la compta MySQL.

Creem el procedure (on XXX és l’usuari administrador que creguem en el moment de crear la base de dades RDS):

 DELIMITER //

CREATE DEFINER=`XXX`@`%` PROCEDURE `optimizer_switch`()

BEGIN

IF CURRENT_USER()<>’rdsadmin@%’ THEN

SET SESSION optimizer_switch=’rowid_filter=off’;

END IF;

END

//

Una vegada creat el procedure, afegim la crida del mateix a la funció init_connect de la base de dades RDS:

1. Accedim a la consola i ens dirigim al panell de les RDS.

2. Seleccionem la instància i cliquem en configuració i seleccionem el Parameter Group que tenim assignat en la instància.

3. Una vegada ens trobem en la pàgina principal de Parameter Group, busquem el paràmetre que ens ocupa.

4. I en el camp valor introduïm l’anomenada al procedure:

CALL <<database>>.optimizer.switch();

*On database, és el nom de la base de dades en la qual s’ha creat el procedure

Aquest paràmetre és dinàmic, per tant no requereix d’un reinici de la base de dades per a ser aplicat.

Una vegada s’ha modificat el paràmetre, podrem observar una millora significativa en la performance de la nostra base de dades i Magento.