Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die gespeicherte MySQL-Prozedur ist 20-mal langsamer als die Standardabfrage

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.