Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

procedimento armazenado mysql é mais lento 20 vezes do que a consulta padrão


Apenas um palpite:

Quando você executa a consulta manualmente, a expressão WHERE ('test' IS NULL or COL1 = 'test') pode ser otimizado quando a consulta está sendo analisada. O analisador pode ver que a string 'test' não é nulo, então converte o teste para WHERE COL1 = 'test' . E se houver um índice em COL1 isso será usado.

No entanto, quando você cria um procedimento armazenado, a análise ocorre quando o procedimento é criado. Nesse momento, ele não sabe o que @param será, e tem que implementar a consulta como uma varredura sequencial da tabela.

Tente alterar seu procedimento para:
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;

Eu não tenho muita experiência com procedimentos armazenados do MySQL, então não tenho certeza se essa é a sintaxe correta.