Des de fa uns mesos Amazon Web Services ve avisant de la fi del suport de les versions anteriors a la RDS MariaDB 10.3. Es converteix gairebé en una obligació realitzar una actualització. Si et trobes en aquesta situació, t’expliquem a continuació com solucionar alguns problemes de performance amb els quals pots trobar-te.
Cal destacar que, en aquest cas, actualitzarem una base de dades MariaDB versió 10.0.17. Després d’observar la freqüència amb la qual MariaDB i AWS actualitzen el seu entorn, decidim decantar-nos per actualitzar a MariaDB 10.4.8.
Aparentment els canvis entre versions únicament afecten un parell de variables globals, les quals no són stopper per a realitzar l’actualització. Pots consultar els canvis de variables aquí.
L’actualització transcorre sense cap imprevist ni error. Però en poc temps, comencem a observar una degradació de la performance en la base de dades i un augment significatiu del consum de CPU.
Debugant una de les consultes que està penalitzant, realitzant un EXPLAIN d’aquesta, ens trobem diferències entre versions. Sembla ser que, les estadístiques amb les quals el motor de la base de dades compta per a optimitzar les queries s’ha vist afectat d’alguna manera per la migració.
Indagant en la casuística, i comparant variables d’entorn, ens adonem que els valors per defecte de les variables globals use_stat_tables i optimizer_user_condition_selectivity han canviat:
El canvi en el optimizador es realitza en la versió 10.4 i això implica un nou pla d’execució, en funció de la cardinalitat dels índexs que s’han d’utilitzar. En la documentació oficial podem llegir que el valor camp optimizer_use_condition_selectivity pot ser de 0 a 5.
En el cas que ens ocupa, ens fixem en els valors 1 i 4, que són els que ens afecten directament. En la documentació oficial trobem el significat d’aquests valors:
Amb el valor a 4:
“el optimizador hará uso de histogramas para calcular la selectividad de las condiciones de rango que no están respaldadas por ningún índice para calcular la cardinalidad de una combinación parcial. ”
En canvi amb el valor a 1:
“se hará uso de la selectividad de las condiciones de rango respaldado por índice para calcular la cardinalidad de un JOIN parcial si se accede a la última tabla unida mediante un escaneo de tabla completo o un escaneo de índice.”
Com a workaround decidim setejar la variable optimizer_use_condition_selectivity a 1, tal com estava en MariaDB 10.0.17.
Per a modificar la variable en una RDS, hem de realitzar els següents passos:
01. Accedim a la consola de AWS i seleccionem Relational Database Service (RDS)
02. Seleccionem la instància, cliquem en Configuració i seleccionem el Parameter Group que tenim assignat en la instància:
03. Una vegada ens trobem en la pàgina principal de Parameter Group, busquem el paràmetre que ens ocupa:
04. Ho seleccionem i cliquem a Editar paràmetre i introduïm el valor desitjat, en aquest cas 1, i guardem:
IMPORTANT: Una vegada modificat el paràmetre, la base de dades ha de ser reiniciada perquè els canvis s’apliquin, d’una altra manera no es veuran reflectits.
Amb això aconseguim que l’ordre en el qual es efectua el pla d’execució, torni a ser el mateix que sempre. També aconseguim que el temps de resposta com la CPU de la base de dades es recuperi.
Tal com s’indica més amunt, es tracta d’un workaround i s’ha de continuar indagant, tant en com optimitzar les consultes, com a analitzar les variables més detalladament i modificar-les segons el nostre entorn.