Zadejte hledaný výraz...

Dotaz na "MATCH AGAINST IN BOOLEAN MODE" trvá moc dlouho

Potřeboval bych poradit s mySQL dotazem, který trvá 1 až 3 sekundy a to vypíše jen 18x.
Očekávám, že mySQL dotaz bude zpomalovat tento příkaz:
(MATCH(popis) AGAINST('silvestr +na +horách' IN BOOLEAN MODE) OR MATCH(popis) AGAINST('silvestr na horách' IN BOOLEAN MODE))
Otázka je, jak nejlépe upravit dotaz, aby to netrvalo 1 až 3 sekundy :(
SELECT * FROM sleva WHERE (MATCH(popis) AGAINST('silvestr +na +horách' IN BOOLEAN MODE) OR MATCH(popis) AGAINST('silvestr na horách' IN BOOLEAN MODE)) AND povoleno='1' AND platnost_od < '1419773279' AND platnost_do > '1419773279' ORDER BY poradi DESC LIMIT 0, 18
13899
Hrozně moc děkuji za výpomoc.
28. 12. 2014 13:58:38
https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078858
Petr Soukup
verified
rating uzivatele
(5 hodnocení)
28. 12. 2014 14:02:07
A co říká EXPLAIN?
28. 12. 2014 14:02:07
https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078857
explain:
13900
28. 12. 2014 14:14:36
https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078856
sysline
verified
rating uzivatele
(2 hodnocení)
28. 12. 2014 14:25:58
Pominu-li, ze cely navrh te tabulky je dost zalostny, tak vydal bych se cestou nejmensiho odporu...
Je to stejne pomale, pokud v podmince je jen ten fulltext? -> Nahradit MATCH dotaz LIKEm LIKE bude vzdy rychlejsi nez MATCH AGAINST
Sloupec `povoleno` je tinyint/boolean, pritom vstupni parametr vidim string,
Sloupec `platnost_od` chybi index
Co obsahuje variable $time ?
28. 12. 2014 14:25:58
https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078855
index na platnost_od vložen, $time obsahuje aktuální čas v Time().
13901
Na konec jsem tam udělal chybu já sám a to vložený OR by měl být AND, tj.:
MATCH(popis) AGAINST('silvestr +na +horách' IN BOOLEAN MODE) AND MATCH(popis) AGAINST('silvestr na horách' IN BOOLEAN MODE)
28. 12. 2014 14:32:52
https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078854
sysline
verified
rating uzivatele
(2 hodnocení)
28. 12. 2014 14:41:23
Tech chyb, je tam obrovska spousta, kazdopadne pokud $time obsahuje time() z php, tak plastnost_od a platnost_do maji byt timestamp nikoliv int. (Bonus navic: take existuje typ sloupce DATETIME, ktery je rychlejsi nez TIMESTAMP a mimo jine citelnejsi)
Pokud OR zmenis na AND, tak to samozrejme rychlejsi bude, protoze se ten fulltext neprovede dvakrat. Kazdopadne v tom pripade muzes ten prvni MATCH vymazat a zadny AND tam mit nemusis protoze to nedava smysl.
Porad ale plati, ze fulltext hledani LIKE bude rychlejsi nez MATCH AGAINST
28. 12. 2014 14:41:23
https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078853
Váš dotaz má několik problémů.
  • Každý dotaz může využít pouze jeden index (s jednou výjimkou, která se vás netýká). Jelikož už chcete použít index typu FULLTEXT, nemůžete použít klasický index (pro podmínky, v nichž porovnáváte čísla). MySQL vybere jeden index, ve vašem případe index `povoleno`. Vůbec nevyužije fulltextový index, což je možné jen díky tomu, že boolean fulltext search si v tabulce typu MyISAM poradí i bez indexu.
  • Pokud porovnáváte v podmínce více hodnot (`povoleno`, `platnost_od`), musíte vytvořit vícesloupcový index v takovém pořadí, v jakém je používáte v podmínce WHERE.
  • I pro sloupec, který používáte při řazení (ORDER BY), je potřeba index. Opět platí, že MySQL použije pouze jeden index, opět tedy potřebujete vícesloupcový index, který pokryje podmínky ve WHERE i sloupce v ORDER BY. Více zde.
    Mám několik doporučení:
  • Rozmyslete, co vlastně chcete hledat. Mezi AND a OR je obrovský rozdíl. 'silvestr +na +horách' nejspíš nedělá to, co čekáte (požaduje slovo "horách", upřednostňuje výsledky se slovem "silvestr" a nejspíš ignoruje "na", podle toho, jak máte nastavenou hodnotu ft_min_word_len). Mezi 'silvestr +na +horách' a 'silvestr na horách' není téměř rozdíl a nedává smysl je spojit v jednom dotazu, ať už pomocí OR nebo AND - druhá podmínka je podmnožina první.
  • Přečtěte si v manuálu, jak funguje v MySQL fulltextové hledání a indexy. Při přidávání indexů nehádejte, použijte EXPLAIN.
  • Rozdělte dotaz na dva dotazy. V dotazu A se zeptejte na fulltext, v dotazu B na ostatní podmínky a řazení. Který vykonat jako první závisí na konkrétních datech v tabulce. Nejdřív vykonejte ten dotaz, který výsledky filtruje silněji.
  • Vytvořte vícesloupcový index pro dotaz B.
  • Zvažte použití vyhrazeného fulltextového řešení, třeba Sphinx nebo ElasticSearch.
    @sysline
    Vyhledávání pomocí LIKE je podstatně pomalejší než fulltextové hledání.
    13906
    Horizontal axis is number of records, vertical axis is average time to process a query
  • 28. 12. 2014 18:06:30
    https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078852
    sysline
    verified
    rating uzivatele
    (2 hodnocení)
    28. 12. 2014 18:39:09
    Martine, ve vsem s tebou souhlasim, az na ten konec, urceny me.
    Ten benchmark, ktery prikladas a ma potvrdit, to co rikas, bych bral velmi s rezervou. Nehlede na to, ze to je vic jak 2 roky stare.
    LIKE uz z principu musi byt rychlejsi, protoze narozdil od MATCH provadi podstatne mene operaci a predevsim nevyhodnocuje score, jednotlivych nalezenych zaznamu.
    Ono staci vyzkouset si to nad jakoukoliv tabulkou, ktera obsahuje 1k+ zaznamu. A ten rozdil bude jasne patrny...
    28. 12. 2014 18:39:09
    https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078851
    naniccz
    verified
    rating uzivatele
    (3 hodnocení)
    28. 12. 2014 19:25:02
    sysline: to platí jen v případě, že porovnáváte LIKE proti MATCH AGAINST bez indexů.
    Zatímco pro LIKE %% není v MySQL index, tak fulltextový ano.
    28. 12. 2014 19:25:02
    https://webtrh.cz/diskuse/dotaz-na-match-against-in-boolean-mode-trva-moc-dlouho/#reply1078850
    Pro odpověď se přihlašte.
    Přihlásit