Nur eine Vermutung:
Wenn Sie die Abfrage manuell ausführen, wird der Ausdruck WHERE ('test' IS NULL or COL1 = 'test')
kann optimiert werden, wenn die Abfrage analysiert wird. Der Parser kann sehen, dass die Zeichenfolge 'test'
ist nicht null, also konvertiert es den Test in WHERE COL1 = 'test'
. Und wenn es einen Index auf COL1
gibt diese wird verwendet.
Wenn Sie jedoch eine gespeicherte Prozedur erstellen, findet die Analyse statt, wenn die Prozedur erstellt wird. Zu diesem Zeitpunkt weiß es nicht, was @param
ist wird und muss die Abfrage als sequenziellen Scan der Tabelle implementieren.
Versuchen Sie, Ihr Verfahren zu ändern:
IF @param IS NULL
THEN BEGIN
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
...
END;
ELSE BEGIN
SELECT * FROM table1 WHERE col1 = @param
UNION ALL
SELECT * FROM table2 WHERE col1 = @param
...
END;
END IF;
Ich habe nicht viel Erfahrung mit gespeicherten MySQL-Prozeduren, daher bin ich mir nicht sicher, ob das die richtige Syntax ist.