2016-04-26 10 views
1

Ich habe unter SQL-Abfrage, die ich dynamisch basierend auf Benutzereingaben erstellen. Während die Abfrage relativ gut funktioniert, solange die IN-Parameter < 50 sind. Sobald jedoch die IN-Liste wächst, nimmt die Abfrageantwortzeit erheblich ab.MYSQL Abfrageoptimierung für SQL-Abfrage mit IN-Klausel

Ich habe in mehreren Abfragen mit kleinem Eingang versuchte Splitting Abfrage und alle Abfragen parallel .Dieses Brennen auf jeden Fall gibt mir ein bessere Leistung

jedoch i Splitting Abfrage vermeiden möchte, wenn jeder andere wissen möchte (besser) Art, wie ich weiter diese Abfrage optimieren kann (i denke ich, wenn durch someway i durch die Schaffung von temporären Tabellen beitreten können)

[pls Anmerkung col1 & col2 sind bereits ein Index]

SELECT a.col3, b.col5, b.col4, ... 
FROM A a 
    JOIN B b ON a.apk = b.afk AND a.bfk = b.bpk 
WHERE a.col1 IN (1, 2, 3, ...) 
    AND a.col2 IN ('abc', 'pqr', ...) 
    AND a.flag = 1 
+2

Erstellen Sie eine temporäre Tabelle aus diesen Parametern und JOIN darauf – Mihai

+0

ON a.apk = b.afk UND a.bfk = b.bpk .... ist es richtig, wie Sie beide Tabellen basierend auf 2 verschiedenen Spalten. .. –

+0

Mindestens Fragen zur Abfrageleistung erfordern IMMER richtige CREATE-Anweisungen für alle relevanten Tabellen UND das Ergebnis der EXPLAIN. – Strawberry

Antwort

0

MySQL doe s ist ein guter Job im Umgang mit IN Abfragen mit Konstanten. Im Gegensatz zu vielen anderen Datenbanken sortiert es die Eingaben und verwendet einen Binärbaum für die Suche. Also, meine Vermutung ist, dass die Menge der Daten das Problem ist und nicht die IN selbst. Die Tatsache, dass parallele Threads besser funktionieren, spricht nur dafür, dass MySQL nicht alle verfügbaren Ressourcen für eine individuelle Abfrage verwendet.

Sie können versuchen, Indizes. Für diese Abfrage:

SELECT a.col3, b.col5, b.col4, ... 
FROM A a JOIN 
    B b 
    ON a.apk = b.afk AND a.bfk = b.bpk 
WHERE a.col1 IN (1, 2, 3, ...) AND 
     a.col2 IN ('abc', 'pqr', ...) AND 
     a.flag = 1 ; 

Sie wollen Indizes auf b(fk, bpk) und entweder a(flag, col1, col2) oder a(flag, col2, col1). Der mehrspaltige Index kann mit dem IN helfen, aber nur für einen von ihnen, also sollte die zweite Spalte im Index die selektivere sein.