Bare et gæt:
Når du kører forespørgslen manuelt, udtrykket WHERE ('test' IS NULL or COL1 = 'test')
kan optimeres, når forespørgslen parses. Parseren kan se, at strengen 'test'
er ikke null, så den konverterer testen til WHERE COL1 = 'test'
. Og hvis der er et indeks på COL1
dette vil blive brugt.
Men når du opretter en lagret procedure, sker parsing, når proceduren oprettes. På det tidspunkt ved den ikke hvad @param
vil være, og skal implementere forespørgslen som en sekventiel scanning af tabellen.
Prøv at ændre din procedure til:
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;
Jeg har ikke meget erfaring med MySQL-lagrede procedurer, så jeg er ikke sikker på, at det er den rigtige syntaks.