Anteriormente, os explicamos cómo actualizar tu base de datos a MariaDB 10.4, solventando los problemas de performance que surgían durante el proceso. En este artículo, te explicaremos otro problema que puedes encontrarte con esta base de datos. Concretamente, cuando se asocia con Magento.

Si estás utilizando la plataforma Magento y has instalado MariaDB 10.4, puede que te hayas dado cuenta de que cuando Magento lanza las consultas a la base de datos, esta tarda demasiado en devolver el resultado. Esto se traduce en un encolamiento de queries y, por consiguiente, en un cuello de botella que puede incrementar el porcentaje de CPU ocupada.

Hasta aquí, ningún problema, pero solo si tenemos acceso a la configuración de la base de datos (my.cnf).

Si se trata de un servicio gestionado, como las RDS de Amazon Web Services, este campo no se puede modificar desde los parameter groups, ya que dicho parámetro no existe.

Si intentamos setearlo, la consola nos devolverá el siguiente 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)”

Esta variable se puede setear con el parámetro indicado desde la misma Command Line de MySQL, pero solo a nivel de sesión, así que modificarlo a mano para cada sesión se hace insostenible.

Como workaround, decidimos crear un procedure para modificar esta variable y que este procedure sea invocado por la función init_connect con la que cuenta MySQL.

Creamos el procedure (donde XXX es el usuario administrador que creamos en el momento de crear la base de datos 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 vez creado el procedure, añadimos la llamada del mismo a la función init_connect de la base de datos RDS:

1. Accedemos a la consola y nos dirigimos al panel de las RDS.

2. Seleccionamos la instancia y clicamos en configuración y seleccionamos el Parameter Group que tenemos asignado en la instancia.

3. Una vez nos encontramos en la página principal de Parameter Group, buscamos el parámetro que nos ocupa.

4. Y en el campo valor introducimos la llamada al procedure:

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

*Donde database, es el nombre de la base de datos en la que se ha creado el procedure

Este parámetro es dinámico, con lo que no requiere de un reinicio de la base de datos para ser aplicado.

Una vez se ha modificado el parámetro, podremos observar una mejora significativa en la performance de nuestra base de datos y Magento.