Autor Zpráva
Prochy
Profil
Zdravim,

rád bych se optal na rady ohledně fulltextového vyhledávání u MySQL v 5.0.x, když je typu InnoDB? Je to možné nějak šikovně vyřešit bez pomocí nějakého externího nástroje jako je sphinx? Chtěl jsem to udělat pomocí like, ale to je bohužel pomalé. Vyhledávám to v třech tabulkách, celkem v 5 sloupcích. Je to asi 10 tisíc záznámů, čekal jsem, že by tohle ještě Like zvládal, ale asi sem se spletl. Na ukázku dotaz, jestli tam nedělám někde chybu. Pokud u kineziologického rozboru dám right join, tak to jede rychle, dotaz trvá přibližně 300ms i při 5 slovech a víc, jakmile tam dám leftJoin, tak už to je k 80 sekundám.

Zde ten dotaz:
SELECT `clients`.`id`,    
 `clients`.`date_reg`,
 `clients`.`surname`,
 `clients`.`first_name`, 
 `clients`.`email`, 
 `visits`.`date_visit`, 
 `categorie_client`.`categorie`,
 `source_client`.`source`,
 `list_communication`.`name` as `communication`
FROM `clients` 
LEFT JOIN `visits` ON(`clients`.`id`=`visits`.`client_id`) 
LEFT JOIN `kineziologicky_rozbor` ON(`kineziologicky_rozbor`.`client_id`=`clients`.`id`) 
JOIN `categorie_client` ON(`categorie_client`.`id`=`clients`.`categorie_client`) 
JOIN `source_client` ON(`source_client`.`id`=`clients`.`source_client`) 
JOIN `list_communication` ON(`list_communication`.`id`=`clients`.`communication`) 
WHERE (( `clients`.`diagnosis` LIKE '%test%' OR `clients`.`private` LIKE '%test%' OR
`kineziologicky_rozbor`.`subjektivni_pocit` LIKE '%test%' ) OR ((`date_visit` BETWEEN 0 AND
20140420) AND ( `visits`.`exam_to_therapy` LIKE '%test%' OR `visits`.`description_therapy` LIKE
'%test%' ))) 
GROUP BY `clients`.`id`

Tabulka clients má cca 3tisíce záznamů visits 8tisíc a kineziol 2tisíce
Kajman
Profil
Tu samou tabulku (stačí i sloupce pk a pro fulltext) můžete mít uloženou i v myisam, kde fulltextový index jde udělat. Nebo přejít na novější verzi.
Prochy
Profil
Díky za odpověď.
Bohužel databázi mi asi na hostingu neaktualizují, jelikož tam novější nemají. Co se týče změny tabulky na myisam, tak tam asi nepochodím jelikož jsou v tabulce použity cizí klíče, které pokud se nepletu myisam neumí. Našel jsem možnost, že bych mohl využít trigger, kde bych data, která bych fulltextově vyhledával duplikovat do tabulky, která už by byla myisam. Zajímalo by mě, jestli to je správné řešení, nebo by to bylo lepší řešit jinak?

Děkuji
Kajman
Profil
Ano, však to jsem psal. Mít ta data uložená i v myisam. Ale na triggery na 5.0 zapomeňte, na ty je v té verzi potřeba super oprávnění, které Vám rozumný sdílený hosting nedá.

Pokud nejde změnit verzi mysql v rámci hostingu, může být nejjednodušším řešením změna hostingu.
Prochy
Profil
Aha, tak to je pech, trigger nejde vytvořit, jak už si avizoval. Uvidim, co řekne zákazník na změnu toho hostingu no. Ještě mě napadlo řešit to pomocí cronu, kde bych každou noc, duplikoval data do myisam tabulky. Sice by to nevyhledalo data z aktuálního dne, ale to by asi tak nevadilo.

Jinak dotaz zvyšuje se novější verzí MySQL bezpečnost? Nebo pouze mám možnost využít lepších funkcí? V tomhle si nejsem tak jistý.
Kajman
Profil
Prochy:
zvyšuje se novější verzí MySQL bezpečnost? Nebo pouze mám možnost využít lepších funkcí?

Projdi si změny až do verze 5.6, která umí fulltext i na innodb. Najdeš tam i věci ohledně bezpečnosti.
http://dev.mysql.com/doc/refman/5.1/en/mysql-nutshell.html
http://dev.mysql.com/doc/refman/5.5/en/mysql-nutshell.html
http://dev.mysql.com/doc/refman/5.6/en/mysql-nutshell.html

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: