Vorgeschlagene Produkte für die SQL-Abfrageoptimierung

Ich werde jetzt versuchen, besser zu erklären, was der Zweck der folgenden Frage und Abfrage ist. Angenommen, es handelt sich um eine E-Commerce-Umgebung und -Datenbank. Wir haben unter anderem drei Tabellen: products, orders und orders_data. Die Tabelle ORDERS behandelt alle aufgegebenen Bestellungen und eine Untertabelle, die wir ORDERS_DATA nennen, speichert alle in einer Bestellung erfassten Produkte.

Nach der Tabellendefinition ohne die für meine Frage ungewöhnlichen Felder:

    ORDERS (*id*, date, totale, ...);
    ORDERS_DATA (id_order, id_product, ...);
    PRODUCTS (id, name, ...);

Der Primärschlüssel inAUFTRÄGE istIch würde, während in ORDERS_DATA der Schlüssel ist(id_order, id_product).

Was ich mit einer Abfrage machen möchte, ist das Abrufen, gegeben einPRODUKT ID (beim Surfen auf einer Produkt- oder Warenkorbseite), empfohlene Produkte basierend auf der Tabelle ORDERS_DATA. Die Abfrage gibt alle id_product zurück, die in diesen Aufträgen enthalten sind, wobei mindestens eines dieser Produkte angegeben istPRODUKT ID

Der Einfachheit halber werde ich ein Beispiel nennen. Nehmen wir an, wir haben diese Zeilen in ORDERS_DATA:

R1(1, 1); R2(1, 2); R3(1, 3); R4(2, 2), R5(2, 5); R6(3, 3);

Ich möchte Vorschläge für Produkt-ID = 2. Meine Abfrage gibt IDs zurück: 1 und 3 (von R1 und R3 - sie haben dieselbe Bestell-ID und diese Bestellung hat auch Produkt 2 - von R2 - zwischen ihren Produkten) und Produkt 5 dank die Bestellnummer 2. Bestellnummer 3 wird ignoriert.

Dies ist die Abfrage, die ich geschrieben habe, aber ich bin mir ziemlich sicher, dass sie nicht die beste in Bezug auf Leistung und Stil ist.

SELECT 
    A.id_product, COUNT( A.id_product ) AS num
FROM  
    orders_data A, orders_data B
WHERE 
    A.id_order = B.id_order
    AND B.id_product IN  (*IDs-HERE*)
    AND A.id_product NOT IN (*IDs-HERE*)
GROUP BY A.id_product

Ich habe bereits die INNER JOIN-Syntax verwendet, aber nichts an der Leistung geändert. Die Abfrage dauert 0,0022 Sekunden mit nur einer Produkt-ID in der IN-Klausel. Die Leistung nimmt mit mehreren Produkt-IDs exponentiell ab (z. B. während der Warenkorbseite, wenn sich mehr Produkte im Warenkorb befinden).

Vielen Dank.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage