sql >> Databáze >  >> RDS >> Mysql

Uložená procedura mysql je 20krát pomalejší než standardní dotaz

Jen odhad:

Když spustíte dotaz ručně, výraz WHERE ('test' IS NULL or COL1 = 'test') lze optimalizovat při analýze dotazu. Analyzátor vidí, že řetězec 'test' není null, takže převede test na WHERE COL1 = 'test' . A pokud je na COL1 index toto bude použito.

Když však vytvoříte uloženou proceduru, k analýze dojde při vytvoření procedury. V té době neví co @param bude a musí implementovat dotaz jako sekvenční skenování tabulky.

Zkuste změnit svůj postup na:

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;

Nemám mnoho zkušeností s uloženými procedurami MySQL, takže si nejsem jistý, zda je to správná syntaxe.



  1. Jak ATAN() funguje v MariaDB

  2. Co je CHAR_LENGTH() v MySQL?

  3. Příklady DAY() – MySQL

  4. Vrátit číslo z příkazu Oracle Select po datu analýzy