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

Optimalizace vyhledávání MySQL pomocí podobných a zástupných znaků

Jak dlouhé jsou vaše struny?

Pokud jsou relativně krátké (např. anglická slova; avg_len=5) a máte volné místo v databázi, zkuste tento postup:

  • Pro každé slovo, které chcete uložit do tabulky, vezměte místo toho všechny možné přípony daného slova. Jinými slovy, stále odebíráte první znak, dokud nezůstane nic. Například slovo value dává:
    • value
    • alue
    • lue
    • ue
    • e
  • Uložte každý těchto přípon v databázi.
  • Nyní můžete vyhledávat podřetězce pomocí LIKE 'alu%' (který najde 'alu' jako součást 'value').

Uložením všech přípon jste odstranili potřebu úvodního zástupného znaku (což umožňuje použití indexu pro rychlé vyhledávání), a to za cenu úložného prostoru.

Cena úložiště

Počet znaků potřebných k uložení slova se změní na word_len*word_len / 2 , tedy kvadratický v délce slova, na základě slov. Zde je faktor zvýšení pro různé velikosti slov:

  • 3písmenné slovo:(3*3/2) / 3 = 1.5
  • 5písmenné slovo:(5*5/2) / 5 = 2.5
  • 7písmenné slovo:(7*7/2) / 7 = 3.5
  • 12písmenné slovo:(12*12/2) / 12 = 6

Počet řádků potřebných k uložení slova se zvýší z 1 na word_len . Mějte na paměti tuto režii. Další sloupce by měly být omezeny na minimum, aby se zabránilo ukládání velkého množství nadbytečných dat. Například číslo stránky, na které bylo slovo původně nalezeno, by mělo být v pořádku (uvažujte bez znaménka smallint), ale rozsáhlá metadata o slovu by měla být uložena v samostatné tabulce pro jednotlivá slova, nikoli pro každou příponu.

Úvahy

Existuje kompromis v tom, kde rozdělujeme „slova“ (nebo fragmenty). Jako příklad ze skutečného světa:co děláme s pomlčkami? Ukládáme přídavné jméno five-letter jako jedno nebo dvě slova?

Kompromis je následující:

  • Cokoli, co je rozděleno, nelze nalézt jako jeden prvek. Pokud uložíme five a letter samostatně vyhledáním five-letter nebo fiveletter selže.
  • Cokoli, co není rozbité zaberou více úložného prostoru. Pamatujte, že požadavek na úložiště se zvyšuje kvadraticky v délce slova.

Pro usnadnění můžete chtít odstranit pomlčku a uložit fiveletter . Slovo lze nyní najít vyhledáním five , letter a fiveletter . (Pokud odstraníte pomlčky i z jakéhokoli vyhledávacího dotazu, uživatelé mohou stále úspěšně najít five-letter .)

A konečně, existují způsoby ukládání polí přípon, které nevyžadují mnoho režijních nákladů, ale zatím si nejsem jistý, zda se dobře překládají do databází.



  1. Sekvence nejsou ovlivněny transakcemi?

  2. Jak získat počet každé odlišné hodnoty ve sloupci?

  3. Tuning:Dobré místo pro začátek

  4. Jak mohu odstranit pomocí INNER JOIN s SQL Server?