Само предположение:
Когато стартирате заявката на ръка, изразът WHERE ('test' IS NULL or COL1 = 'test')
може да се оптимизира, когато заявката се анализира. Анализаторът може да види, че низът 'test'
не е null, така че преобразува теста в WHERE COL1 = 'test'
. И ако има индекс на COL1
това ще се използва.
Въпреки това, когато създадете съхранена процедура, синтактичният анализ се случва, когато процедурата е създадена. По това време то не знае какво @param
ще бъде и трябва да приложи заявката като последователно сканиране на таблицата.
Опитайте да промените процедурата си на:
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;
Нямам много опит със съхранените процедури на MySQL, така че не съм сигурен, че това е правилният синтаксис.