Query Laufzeit verdoppelt sich bei Wechsel von "=" zu "IN"

magda89

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich habe eine Frage zum Verhalten meiner WHERE Abfrage. Die Situation ist folgende: Ich habe eine Tabelle, die ca 800.000 Zeilen besitzt. In dieser Tabelle ist u.a. eine Variable (ENUM mit 4 möglichen Ausprägungen: "yes", "no", "yes exception", "no exception"), die ich in der WHERE Clause nach 'variable = "yes"' abfrage (das ganze Query enthält einige JOINs).
Mit der Abfrage 'WHERE variable = "yes"' läuft das Query ca 80ms. Jetzt möchte ich gerne beide Ausprägungen "yes" & "yes exception" abfragen, also 'WHERE variable IN ("yes", "yes exception")'. Sobald ich die WHERE Clause dementsprechend anpasse, läuft das Query 160ms.
Es gibt ca 70.000 Zeilen, die den ENUM Wert "yes" haben und nur 28 Zeilen, die den ENUM Wert "yes exception" haben. Es ist ein Index auf der Variable drauf.

Wisst ihr woran das liegen könnte, dass diese 28 Einträge das Query so viel langsamer machen?
Vielen Dank für eure Hilfe!

P.S.: 160ms scheinen nicht viel zu sein, aber das ist ein Query was sehr oft abgerufen wird und in Summe macht es meine ganze Anwendung langsamer...
 
Werbung:
Vermutlich kann MySQL bei = einen Index verwenden, aber nicht für den IN Operator. Der Execution plan sollte darüber Aufschluss geben.

P.S.: eine Tabelle hat Spalten, also sind Indizes auf Spalten nicht "Variablen".
 
Ich hoffe du hast auch
WHERE spalte IN ("yes", "yes exception")'
nicht
WHERE variable IN ("yes", "yes exception")'
in deinem WHERE-Teil stehen.

Das lässt sich ja auch leicht mal testen in dem man statt IN ein klassisches OR verwendet:
WHERE (spalte = "yes" OR spalte = "yes exception") ...
 
Poste doch erst mal das Ergebnis **EXPLAIN SELECT ....** von deinem Query, sowie das Create Table von den Tabellen und das dein SELECT.

Dann kann man aus eine Aussage Treffen und muss nicht mit der Glaskugel arbeiten
 
Werbung:
Genauso wichtig ist die MySQL Version die du nutzt und du kannst auch mal BEIDE Querys wie unten stehend abfahren und das Ergebnis posten.
Daran kann man sehen in welchen Funktionen MySQL mehr Zeit benötigt und ggf. das Setup abändern.



Code:
set profiling = ON;
SELECT ... (mit query 1 ausführen)

show profile all;
set profiling = OFF;

Das gleiche mit Query 2 (IN(...))
 
Zurück
Oben