Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: procedury i triggery
Forum PHP.pl > Forum > Bazy danych > MySQL
ciekawski
Witam,
jestem w tym temacie zasadniczo początkujący, dlatego mam na wstępie kilka pytań. Pierwsze, teoretyczne bardziej, to czy wykonanie procedury jest atomowe, tzn. objęte jedną transakcją (mam nadzieję, że mimo, iż pewnie źle to nazywam wiadomo o co chodzi smile.gif ).
Drugie pytanie jest już bardziej praktyczne. Mianowicie robię prostą stronę, w której będzie wyszukiwarka. Do tej pory robiąc wyszukiwanie korzystałem z LIKE, jednak czytałem o jego wadach. Chciałbym korzystać z AGAINST MATCH, gdyż jest podobno lepsze, ale mam table InnoDB. Czy zatem taki trick, że będę dublować tabele, wyszukiwać w tabeli myisam, a wszystkie inne dane w tabeli InnoDB. Można by np po stronie mysql napisać do tego procedurę. Co sądzicie o takim rozwiązaniu? Zależy mi na wydajności, ale też dobrym wyszukiwaniu (wiem, że istnieją silniki do wyszukiwania pełnotekstowego, ale nie na poziomie php, więc nie chciałbym z nich korzystać). Jakie są Wasze przemyślenia na ten temat? Opłaca się takie coś stosować? Też pytanie o zalety InnoDB nad myisam, bo być może tabele z podstronami zrobić w myisam (wówczas tracę możliwość transakcji z udziałem tej tabeli, co też nie za bardzo mi się podoba). Proszę o Wasze opinie...

z góry dzięki
phpion
Taki już jest MySQL. Albo więzy integralności i transakcje, albo wyszukiwanie pełnotekstowe. Możesz zrobić tak, że mając np. komentarze i chcąc umożliwić wyszukiwanie pełnotekstowe po ich treści pakujesz całość do dwóch tabel.

1. comments [id, user_id, created_at]
2. comment_contents [comment_id, content]

Pierwsza tabela może być InnoDB. Pole id jest kluczem głównym z Auto Increment. Druga tabela jest typu MyISAM, pole comment_id jest zarazem kluczem głównym oraz kluczem obcym (do tabeli comments). Na polu content założony jest indeks do wyszukiwania pełnotekstowego. Wyszukując komentarze szukasz ich w drugiej tabeli dołączając odpowiedni rekord z pierwszej (JOIN).

Oczywiście istnieje problem z utrzymaniem integralności danych (usuwając komentarz nie usuniesz automatycznie jego treści z drugiej tabeli). Musisz o to zadbać "ręcznie" albo (lepsze rozwiązanie) zastosować triggera, który zrobi to automatycznie.
wookieb
Co zamiast MyIsam
Sposobów na wyszukiwanie jest w cholere więcej. Możesz użyć n-gramów i będzie spoko. Możesz również użyć Sphinxa - jeszcze lepiej.

MyIsam : InnoDb -> MyIsam
Także jeżeli pomimo wszystko chcesz używać myisam do wyszukiwania to triggerem możesz kopiować zawartość pola z tabeli InnoDB do MyISAM (po to żeby zaoszczędzić miejsce).
Przy wyszukiwaniu pobierasz tylko ID komentarza z tabeli MyIsam
  1. SELECT a.*
  2. FROM myisam_table a
  3. INNER JOIN innodb_table b USING (id)
  4. WHERE (...)


Oczywiście rodzi to jeden problem. Dane kopiowane w triggerze nie zostaną objęte transakcją, także nie ma szansy zrobić rollbacka aczkolwiek możesz to obejść przez odpalenie co jakiś czas skryptu czyszczącego MyIsam z rekordów, które nie istnieją w drugiej tabeli.
ciekawski
Cytat
Możesz również użyć Sphinxa - jeszcze lepiej.

ale chyba Sphinxa już na standardowym hostingu nie uruchomię?
wookieb
No niestety raczej nie.
ciekawski
ale zdaje się, że n-gramy już tak, znalazłem info na blogu i w en wikipedii - sądzę, że są raczej wystarczające ( http://en.wikipedia.org/wiki/N-gram oraz http://www.beldzio.com/czy-chodzilo-ci-o-&....-czyli-n-gramy) - jeżeli jednak masz jakieś inne/lepsze źródło to chętnie zajrzę. Faktycznie wydaje się to lepsze rozwiązanie aniżeli dublowanie tabel. Dzięki za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.