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.
Schreibe einen Kommentar