Probleme mit MariaDB

Maria DB scheint Querys und dessen Resultate zu cachen. Ähnliche (Selbe WHERE und LIMIT Eigenschaften, jedoch andere Sortierung mit einem fiktiven/generierten Datenbank-Feld) Querys erhalten anschließend die selben (aber unerwünshten) Resultate. Nach ca 10-15min werden dann die richtigen Resultate geliefert. Sieht mir deshalb stark danach aus, dass MariaDB in der Grundeinstellung einen Cache hat. Würde mich deshalb mal interessieren ob man via DAL oder MySQL diesen Cache für eine bestimmte Tabelle unterbinden kann. Hat da jmd schon Erfahrungen mit?

Bei MySQL gibts an dieser Stelle auch keinerlei Probleme!

 

Hallo Moorleiche,

MariaDB kommt zwar grundsätzlich mit dem Cache Modul - es sollte aber eigentlich inaktiv sein.

Mit folgendem Befehl schaust du, ob dein MariaDB mit Cache gebaut wurde:

SHOW VARIABLES LIKE 'have_query_cache';

Wenn du MariaDB <=10.1.6 einsetzt, ist der Cache zwar standardmäßig ein, aber die Cache Size (query_cache_size) auf 0. 

MariaDB >=10.1.7 setzt den Cache auf aus, hat aber eine Cache Size von default 1MB. 

Mit folgendem Befehl lässt du dir anzeigen, ob der Cache an oder aus ist:

SHOW VARIABLES LIKE 'query_cache_type';

Wenn der Wert ‚1‘ ist, ist der Cache an. Du kannst ihn so für alles deaktivieren.

Wenn du eine bestimmte Querry nicht cachen willst, geht es folgendermaßen (immer nach dem ersten SELECT):

SELECT SQL_NO_CACHE 

Wenn du nur bestimmte Querrys cachen willst, kannst du das folgend machen:

Setze den query_cache_type auf 2. Dann kannst du mit SQL_CACHE statt SQL_NO_CACHE (also wie eine Whitelist statt Blacklist) den Cache für bestimmte Abfragen einschalten. Diese landen dann im Cache.

Der Cache cacht keinen bestimmten Table sondern immer Abfragen.

 

Gruß

0xf76

2 „Gefällt mir“

Hi danke für die Erklärung :wink:

Ich finde die Lösung eigentlich ganz gut: SELECT SQL_NO_CACHE, da der Cache sicherlich idR aus Performance Gründen Sinn macht. Aber das wäre eien Baustelle für den Shopware Core.

VG

Für mich klingt das erstmal nach einen MariaDB Fehler. Von daher würde ich eher versuchen eine Reproduzierbare Query zu haben und einen Bug Report bei MariaDB zu machen.
Der Query Cache wird invalidiert, sobald etwas an der Tabelle bearbeitet wird

@Shyim schrieb:

Für mich klingt das erstmal nach einen MariaDB Fehler. Von daher würde ich eher versuchen eine Reproduzierbare Query zu haben und einen Bug Report bei MariaDB zu machen.
Der Query Cache wird invalidiert, sobald etwas an der Tabelle bearbeitet wird

 

Das weiß ich nicht, das liegt an meinem FieldAccessorBuilder, dort berechne ich eine fiktive Tabellen-Spalte und setze darauf eine Sortierung an. In MariaDB wird der Query wohl nicht als ein Anderer erkannt und wird deshalb gecached. Ich kann das natürlich auch umgehen indem ich einen zusätzlichen WHERE Filter einbaue der sich bei jedem Query ändert - aber eine SQL_NO_CACHE Abfrage halte ich für etwas eleganter.

getExtension('DistanceField')) {
            return null;
        }

        $lat = (float) $context->getExtension('DistanceField')['lat'];
        $lon = (float) $context->getExtension('DistanceField')['lon'];

        return sprintf(
            '(ACOS(SIN(RADIANS(%F)) * SIN(RADIANS(`%s`.`%s`)) + COS(RADIANS(%F)) * COS(RADIANS(`%s`.`%s`)) * COS(RADIANS(%F) - RADIANS(`%s`.`%s`))) * 6380)',
            $lat,
            $root,
            $field->getLat(),
            $lat,
            $root,
            $field->getLat(),
            $lon,
            $root,
            $field->getLon()
        );
    }
}

Ich habe leider keine Möglichkeit gefunden diesen Teil so zu verpacken:

SELECT (ACOS(SIN(RADIANS(%F)) * SIN(RADIANS(%s.%s)) + COS(RADIANS(%F)) * COS(RADIANS(%s.%s)) * COS(RADIANS(%F) - RADIANS(%s.%s))) * 6380) AS distance FROM merchant

Aber es funktioniert, leider hat MariaDB damit aktuell (Caching-) Probleme…

Problem ist gelöst, in der WHERE Abfrage wird nun zusätzlich eine Bounding-Box für die Umkreissuche via Range Filter eingefügt. Somit ändert sich die Abfrage selbst, es wird nicht an Stelle einer anderen Abfrage gecached und es ist sogar etwas schneller :slight_smile:

1 „Gefällt mir“