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

MySQL select se zdá být velmi pomalý, ale nenapadá vás, jak to zlepšit?

Myslím, že jsou nějaké problémy s dotazem a samotnou definicí tabulky.

  • Table.name je 4K znakový sloupec
  • Dotaz se řadí podle tohoto sloupce

Třídíte podle sloupce, do kterého ukládáte řetězce. Aby bylo možné třídit podle řetězců, je třeba provést porovnání řetězců. Porovnání řetězců bývá pomalá operace a vzhledem k velikosti sloupce, který používáte, je velmi pravděpodobné, že způsobí znatelný zásah do výkonu.

Nemáme žádný údaj o obsahu vašeho name a zdá se obtížné vymyslet skutečný název, který by vyžadoval to mnoho postav.

Pokud tento řetězec obsahuje několik částí dat, které se koncepčně liší, možná by měl být sloupec rozdělen do více samostatných sloupců, je-li to možné, a poté podle potřeby normalizován.

Pokud můžete rozdělit obsah tohoto sloupce na několik menších a pak je použít, porovnání řetězců, i když jsou stále drahé, by bylo „rychlejší“ jednoduše proto, že porovnávané řetězce budou výrazně kratší, než jsou nyní.

Další věc, kterou je třeba zvážit, je, zda můžete optimalizovat vyhledávání vyhýbáním se porovnávání řetězců úplně nebo tím, že se vyhnete dotazům, které způsobí úplné prohledání tabulky navzdory skutečnosti, že jste definovali indexy.

Za tímto účelem byste se měli podívat na použití explain s vaším dotazem, abyste mohli lépe porozumět Plán provádění dotazů

Cituji dokumenty (zdůrazňuji):

Upravit 1

Upřesnili jste, že vaše name sloupec je ve skutečnosti pro uživatelské poznámky. V tomto případě si myslím, že byste měli zvážit následující (v navíc k tomu, co již bylo zmíněno):

  1. Přejmenujte sloupec na něco, co odpovídá jeho skutečnému obsahu
  2. Odeberte index ze sloupce
  3. Ne ne použít tento sloupec k vyhledávání, řazení nebo k jakékoli jiné operaci, než jen k jeho výběru k zobrazení (bylo by to velmi vzácné, pokud bylo potřeba použít pro něco jiného, ​​IMHO.)
  4. Volitelně zvažte změnu sloupce na text zadejte a nebudete se muset tolik starat o uživatelské eseje zkrácení bez varování (pokud GUI nevynucuje uživateli stejný limit délky vstupu)


  1. PDO + MySQL vždy vrací řetězce, ale co MsSQL?

  2. MySQL vybere všechny řádky od minulého měsíce do (nyní() - 1 měsíc), pro účely srovnání

  3. odstranit informace z tabulky mysql, když uživatel zavře svůj prohlížeč

  4. Uložená procedura MySQL způsobila `Příkazy se nesynchronizují`