Autor Zpráva
pajadvorak
Profil
Ahoj, mám tento dotaz do databáze. Bohužel trvá relativně dlouho. Nikde jsem nenašel, že by se dal zrychlit... :-(

Máte prosím někdo řešení, které by zachovalo především hledání i uprostřed slov (proto %slovo% a tudíž fulltext MATCH nelze použít) nebo MySQL nic rychlejšího nemá. Děkuji za každou odpověď.

SELECT * FROM tabulka WHERE (nazev LIKE '%unasec%' OR kod LIKE '%unasec%' OR informace LIKE '%unasec%' OR rozsirene_info LIKE '%unasec%') AND (nazev LIKE '%mum%' OR kod LIKE '%mum%' OR informace LIKE '%mum%' OR rozsirene_info LIKE '%mum%') ORDER BY id
Kajman
Profil
Pokud se to přepsat nedá, tak se rychlost dá zvýšit zrychlením hardware (rychlejší procesor, disky, více paměti, více serverů).

Někdy může být rychlejší využití speciálních vyhledávacích enginů (ElasticSearch, Sphinx), ale netuším, jestli podporují vyhledávání uprostřed slova.
juriad
Profil
pajadvorak:
Myslím, že MySQL samo nic rychlejšího nemá. Hledání uprostřed slov znamená, že musí projít celou tabulku a tupě zkoušet.

ElasticSearch může pomoct: umí wildcard a regex, ale dát ho na začátek slova povede k špatnému výkonu. Častým řešením je použít n-gram filtr, který zajistí, že se bude indexovat každá n-tice, tedy místo "Máte prosím někdo řešení" se zaindexuje "mát, áte, pro, ros, osí, sím, něk, ěkd, kdo, řeš, eše, šen, ení“. Poté když položíš dotaz na "osím", tak daný záznam (dokument) najde.
Jistě si dokážeš představit to samé řešení v MySQL, kde budeš mít extra sloupec, do kterého text takto připravíš a dáš fulltextově zaindexovat. Musíš si dát pozor na vhodnou délku n-gramu (tady byla 3) a jak položit dotaz na délku jinou.

PostgreSQL se zdá umí (po vlastním buildu) zaindexovat suffixy slov: "máte, áte, te, e, prosím, rosím, osím, sím, ím, m, někdo, ěkdo, kdo, do, o, řešení, ešení, šení, ení, ní, í" a následně dotaz LIKE "%x% přepsat na "x%", který je již rychlý. Hledej wildspeed. PostgreSQL také umí trigramy.
pajadvorak
Profil
Ok. Rozumím. Takže tedy zkusíme navýšit výkon u hostingu. Děkuji.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0