Die Geschwindigkeit der Abfrage mit FIND_IN_SET auf MySql
ich habe mehrere Probleme mit meiner Abfrage aus einem Katalog von Produkte.
Die Abfrage ist wie folgt:
SELECT DISTINCT (cc_id) FROM cms_catalogo
JOIN cms_catalogo_lingua ON ccl_id_prod=cc_id
JOIN cms_catalogo_famiglia ON (FIND_IN_SET(ccf_id, cc_famiglia) != 0)
JOIN cms_catalogo_categoria ON (FIND_IN_SET(ccc_id, cc_categoria) != 0)
JOIN cms_catalogo_sottocat ON (FIND_IN_SET(ccs_id, cc_sottocat) != 0)
LEFT JOIN cms_catalogo_order ON cco_id_prod=cc_id AND cco_id_lingua=1 AND cco_id_sottocat=ccs_id
WHERE ccc_nome='Alpine Skiing' AND ccf_nome='Ski'
Bemerkte ich, dass die Abfrage das erste mal es dauert im Durchschnitt 4,5 Sekunden, dann wird schnell.
Ich benutze FIND_IN_SET, weil in meiner Datenbank auf die Tabelle "cms_catalogo" ich habe die Spalte "cc_famiglia" , "cc_categoria" und "cc_sottocat" mit innen-ID, getrennt durch Kommas (ich weiß, es ist dumm).
Beispiel:
Tabelle cms_catalogo
Spalte cc_famiglia: 1,2,3,4,5
Tabelle cms_catalogo_famiglia
Spalte ccf_id: 3
Die Verlangsamung in der Abfrage entstehen können aus der Nutzung der FIND_IN_SET so?
Wenn statt IDs, getrennt durch Komma habe eine Tabelle mit ID als index wäre schneller?
Kann ich nicht erklären jedoch, warum die erste Ausführung der Abfrage ist sehr langsam und dann beschleunigt
- Ja. FIND_IN_SET ist zu schnell, aber es ist immer noch nicht richtig schlagen, normalisiert und indexiert die Daten. Der speed-up ist wahrscheinlich auf Rechnung des query-caching. Auch anders, ist nicht eine Funktion. Schließlich, Ihre Namenskonvention lässt etwas zu wünschen übrig, und Sie sollten versuchen, in die Gewohnheit, richtig qualifizierte Spaltennamen.
- DINSTINCT ist nicht eine Funktion? Warum? Ich Benutze es, um Liste der unterschiedlichen (distinct) Werte, sonst hätte ich Duplikate.
- Das Schlüsselwort DISTINCT ist eine option innerhalb des SELECT-Klausel. Es ist nicht eine Funktion, und enthält daher keine Argumente. Klammern sind nicht notwendig, und hätte keine Auswirkungen auf die bahaviour der DISTINCT-option.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es besser ist die Verwendung von constraint-verbindungen zwischen Tabellen. Damit Sie besser schließen Sie Sie durch den Primärschlüssel.
Wenn Sie wollen, um eine schnelle Optimierung für diese Abfrage:
explain select ...
in mysql zu sehen, die Leistung der Abfrage;ccc_id, ccf_id, ccs_id
;explain select ...
nach Indizes Hinzugefügt.Die erste MySQL Abfrage dauert viel mehr Zeit, weil Sie roh ist-Abfrage, die nächste zwischengespeichert werden. So sollten Sie sich auf die erste Abfrage der Zeit.
Wenn es nicht kompliziert Bericht wird dann die Ausführungszeit sollte weniger als 50-100ms, ansonsten bekommen Sie Probleme mit der performance insgesamt. Denn ich bin so sicher, dass es nicht nur eine Anfrage für Ihre Anwendung.