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

Optimalizace Mysql pro REGEXP

Pokud musíte použít regexp ve stylu WHERE klauzule, určitě vás budou trápit problémy s pomalým dotazováním. Aby vyhledávání ve stylu regulárních výrazů fungovalo, musí MySQL porovnat každou hodnotu ve sloupci vašeho jména s regulárním výrazem. A váš dotaz zdvojnásobil potíže tím, že se podíval také na sloupec vašeho uživatelského jména.

To znamená, že MySQL nemůže využívat žádné indexy, což je způsob, jakým všechny DBMS zrychlují dotazy na velké tabulky.

Existuje několik věcí, které můžete vyzkoušet. Všechny zahrnují rozloučení s REGEXP.

Jedna je tato:

WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

Pokud vytvoříte indexy ve sloupcích se jménem a uživatelským jménem, ​​mělo by to být slušně rychlé. Bude hledat všechna jména/uživatelská jména začínající na 'jack'. Všimněte si, že

WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

bude hledat jména končící na 'jack', ale bude pomalé jako vaše vyhledávání ve stylu regulárních výrazů.

Další věc, kterou můžete udělat, je zjistit, proč vaše aplikace musí být schopna vyhledat část jména nebo uživatelského jména. Tuto funkci můžete ze své aplikace buď odstranit, nebo vymyslet nějaký lepší způsob, jak ji zvládnout.

Možné lepší způsoby:

  1. Požádejte své uživatele, aby rozdělili svá jména do polí křestní jméno a příjmení a vyhledávali samostatně.
  2. Vytvořte samostatnou funkci „prohledat všechny uživatele“, která se použije pouze tehdy, když ji uživatel potřebuje, čímž snížíte frekvenci vašich pomalých dotazů ve stylu regulárních výrazů.
  3. Rozdělte jejich jména do samostatné tabulky jmen a slov pomocí nějakého programu pro předběžné zpracování. Prohledejte tabulku jmen a slov bez regulárního výrazu.
  4. Zjistěte, jak pro tuto funkci použít fulltextové vyhledávání MySQL.

Všechny tyto zahrnují určitou programátorskou práci.



  1. Jak používat trvalé připojení mysqli na různých stránkách

  2. AKTUALIZACE SQL

  3. Spojte řetězec a číslo v MySQL

  4. Jak formátovat čísla v MySQL