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

Mysql stejné dotazy jeden s indexem sekundy, aniž by dostal 10000xFetch čas?

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

má 3 problémy s výkonem:

  • OR je špatně optimalizovaný. V zásadě musí být tabulka naskenována, aby se zkontrolovaly všechny řádky. Indexy pravděpodobně nepomohou.
  • UPPER(indexed-column) zabrání použití indexu v tomto sloupci. To lze snadno vyřešit deklarací tohoto sloupce jako COLLATION to "nerozlišuje malá a velká písmena" - to znamená něco jako utf8_unicode_ci; všimněte si _ci .
  • LIKE '%... nelze použít index kvůli začátku zástupný znak.

Navíc je obvykle pošetilé mít

32497 row(s) returned

Co budeš dělat s tolika řádky? Doba síťového přenosu bude značná, i když samotný dotaz není.

Chcete-li "vyřešit" LIKE , OR a UPPER problémy najednou, shromážděte text do jednoho sloupce v jedné tabulce. Poté zadejte FULLTEXT index v tomto sloupci. MATCH ... AGAINST ... poběží mnohem rychleji – alespoň pro provedení SomeName Vyhledávání. (LEFT JOINs jsou jiná věc.)




  1. komplexní příkaz SQL do různých řádků

  2. doctrine2:jak převést jeden k mnoha na mnoho k mnoha bez ztráty dat

  3. Přechod z MySQL na MySQLi?

  4. Jak vytvořit databázový diagram v Accessu