Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja bazy danych (szybkość)
husky83
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 8.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Mam pewien problem.. Mam bazę danych MySQL, w której (obecnie) jest niecałe 2mln rekordów.
Jest to dosyć duża tablica, ma łącznie ponad 30 pól (kolumn?), wg. phpmyadmin jeden rekord zajmuje średnio 165b (czyli nie tak dużo).

Problem jest taki - obecnie znalezienie kilku rzeczy w tej tabeli zajmuje kilka sekund, np. trzy rzeczy (`tablica` LIKE '%klucz%' OR `tablica` LIKE '%klucz1% ' OR`tablica` LIKE '%klucz2%') to ponad 5 sekund... Niby nic strasznego, ale docelowo baza ma mieć kilkanaście milionów rekordów, wtedy ten czas wydłuży się kilkukrotnie..

W jaki sposób można to zoptymalizować?

Czy zrobić dodatkową tabelę, zawierającą wyłącznie słowa kluczowe (czyli rozdzielone po spacji, przecinkach itd to, co znajduje się obecnie w `tablica` + do tego numer ID z tej 'dużej' tabeli?)?
Da mi to tyle, że nie będę musiał używać LIKE %klucz%, bo będzie tylko jedno konkretne słowo (gorzej z całymi wyrażeniami, ale to też da się zrobić) i będę miał ID już konkretnych rekordów, które sobie potem spokojnie pobiorę...

A może wystarczy wydzielić do osobnej tabeli te dane, wg których przeszukuje i łączyć je przez ID?

Czy to przyspieszy sprawę?

Nie mam pomysłu, a niestety, kiedy baza się rozrośnie (a to następuje bardzo szybko) to czasy wyszukiwania pewnie bardzo się wydłużą...


Cała baza leży na VPS'ie, więc mogę w pełni konfigurować cały serwer - może optymalizację można zrobić także w plikach konfiguracyjnych?

A może przenieść się na inną bazę? (bezpłatną)

Z góry dziękuję za wszelką pomoc (IMG:style_emoticons/default/smile.gif)

Ten post edytował husky83 4.08.2011, 06:10:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
husky83
post
Post #2





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 8.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Zrobiłem tablicę (z polami, które przeszukuję) MyISAM z wyszukiwaniem pełnotekstowym (póki co dla jednej z kolumn) ... Działa błyskawicznie, ale.... Jednak jest pewien problem...


  1. SELECT *
  2. FROM `stats_index`
  3. WHERE `end` =0 AND ( (MATCH (`tabela`) AGAINST ('test1')) OR (MATCH (`tabela`)AGAINST ('test2')) )

daje mi jakieś 6000 wyników, tymczasem

  1. SELECT *
  2. FROM `stats_index`
  3. WHERE `end` =0 AND ( `tabela` LIKE '%test1%' OR `tabela` LIKE '%test2%' )

daje już 15000 wyników (IMG:style_emoticons/default/exclamation.gif)

Przeglądając listę wyników zwykłego wyszukiwania widzę, że wszystkie wyniki są ok, to znaczy, że wyszukiwanie MATCH...AGAINST nie daje pełnych wyników (albo po prostu muszę poczytać dokładniej co i jak ;P)


EDIT (IMG:style_emoticons/default/smile.gif)
Awaria myślenia (IMG:style_emoticons/default/smile.gif)

LIKE %test%
daje w wynikach także np: 'tester','testowanie', a match sprawdza (chyba) całe wyrazy i znajduje tylko 'test'!
Ot takie małe info dla tych, którzy by też się męczyli z wyszukiwaniem (IMG:style_emoticons/default/smile.gif)

Ten post edytował husky83 4.08.2011, 09:22:43
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 04:30