sql >> Database teknologi >  >> RDS >> Mysql

mysql lagret procedure er langsommere 20 gange end standard forespørgsel

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.



  1. Reverse engineer SQLAlchemy deklarativ klassedefinition fra eksisterende MySQL-database?

  2. 4 Fantastiske SQL Server-overvågningsressourcer til databaseadministratorer

  3. SQL Server Masseindsættelse af CSV-fil med inkonsekvente anførselstegn

  4. Sådan får du kommaseparerede værdier fra databasen