Hallo Christian,
Nein, dieser ist nicht ausreichend. Ist id_lists das erste Feld im gemeinsamen Index, so erstelle einen eigenen für id_products. Für id_lists erübrigst sich das, da dies im gemeinsamen Index bereits enthalten ist.
id_products ist das erste Feld im gemeinsamen Index.
dann erstelle einen Index für id_lists :-)
Das ist wichtig, das ist richtig, das ist sinnvoll, selbst wenn es in dieser speziellen Abfrage vielleicht noch nicht einmal gebraucht wird.
Weiterhin ist das innere Subselect überflüssig. Den Zugriff auf die Listen erhältst Du direkt aus der Verknüpfungstabelle.
Kannst du mir sagen, wie ich die Abfrage ansonsten gestalten soll? Mit Joins habe ich noch keine Lösung gefunden. Bei jedem Versuch ist die Komplexität weit über meine Lösung mit dem Subselect gestiegen.
Nein, Du benötigst keinen Join - auch wenn ich Joins mag:
SELECT
p.id_products -- ich gehe davon aus, dass Du an weiteren
-- Spalten interessiert bist und nicht jeder
-- Eintrag in der Tabelle products einen Eintrag
-- in prod_lists haben muss :-)
FROM products p
WHERE p.id_products NOT IN ( -- wobei die id_products nicht in der Liste
SELECT -- der id_products auftaucht
pl.id_products
FROM prods_lists pl -- die in der Verknüpfungstabelle
WHERE pl.id_lists IN (1, 2, 3) -- einer von ein paar ausgewählten Listen zugeordnet sind
)
Du hast Dein Subselect viel zu kompliziert aufgebaut :-)
EXPLAIN sagt bei mir
products: lese alle Einträge, using WHERE (bei mir 212 Zeilen)
Ist ja auch klar: wenn eh' die meisten Einträge gelesen werden müssen, lohnt es sich nicht, einen Index zu nutzen.
prod_lists: zwei mögliche Indexe: using index, using where (2 Zeilen)
Tabelle "products" enthält bei mir 212 Zeilen, Tabelle "prod_lists" enthält 318 Zeilen, die Ergebnismenge liefert bei mir 191 Zeilen.
Freundliche Grüße
Vinzenz