![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
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
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. -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Możesz również użyć Sphinxa - jeszcze lepiej. ale chyba Sphinxa już na standardowym hostingu nie uruchomię? |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
No niestety raczej nie.
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
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
![]() Ten post edytował ciekawski 27.07.2010, 09:49:10 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 14:31 |