Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Szybkie przeszukiwanie dużych ilości danych co wybrać?
Forum PHP.pl > Forum > PHP
maniak11
Witam,
Jestem w trakcie robienia szukajki mniej więcej takiej jak jest na http://dom.gratka.pl/ i chodzi mi o szybkość wyświetlania się wyników w trakcie wpisywania. Korzystam przy tym z jQuery, ale mam poważny dylemat w jakiej postaci powinny być przechowywane dane. Chodzi o to że mam bazę ok. 100 tyś miast w polsce a taką ilość nie jest łatwo szybko przeszukać, co będzie najszybsze:

1) - zapisać to w formie tablicy np. nazwa -> id
2) plik xml
3) baza mysql - jeśli baza to jakie powinna mieć ustawienia (fulltext, index itd) bo o ile sql-a znam dość dobrze o tyle na szczegółowych ustawieniach tego typu nie bardzo się znam co do czego.

W tym przypadku szybkość jest naprawdę ważna bo nikt nie będzie czekał 10sek. aż mu się wyświetlą podpowiedzi smile.gif

Pozdrawiam wszystkich
fander
przy złożonej bazie zalecam użycie postgresa, jest dużo bardziej wydajniejszy niż mysql w kontakcie ze złożonymi zapytaniami
janusz85
Na pewno nie XML, zanim go sparsujesz to wieki miną. smile.gif
maniak11
Dzięki chłopaki, a co z tablicą? Bo jest mi wszystko jedno do jakiej postaci to przeniosę, baza nie musi być bo nie są to dane które będą jakoś aktualizowane (dodawanie usuwanie rekordów odpada) chodzi tylko o szybkie wyświetlenie. Czy jednak z bazy szybciej wyszuka niż z normalnej tablicy gdzie potem będe miał coś takiego:

  1. <?php
  2. foreach ($miasta as $item) {
  3.    if (strpos(strtolower($item), $q) !== false) {
  4.        echo "$item\n";
  5.    }
  6. }
  7. ?>


?
Fifi209
Zapisz w postaci zserializowanej tablicy w cache. smile.gif
dr_bonzo
A nie mozesz trzymac miast w bazie, a potem ajaxem wyslac zapytania "znajdz miasta zaczynajace sie na Wro"?
Sa do tego gotowe pluginy: autocomplete
http://dyve.net/jquery/?autocomplete
http://www.pengoworks.com/workshop/jquery/autocomplete.htm

Cytat
W tym przypadku szybkość jest naprawdę ważna bo nikt nie będzie czekał 10sek. aż mu się wyświetlą podpowiedzi

Zwykly varchar ci starczy + WHERE city_name LIKE 'wro%', predkosc pojawiania sie podpowiedzi bedzie zalezec i tak od szybkosci lacza userka - taka SQLka jest mega prosta i szybka.
maniak11
@dr_bonzo: dzięki za odp. - ja to wszystko wiem, tylko nie wiem po prostu jak szybko to będzie działać przy tak dużej ilości rekordów, czy podpowiedzi pokażą się powiedzmy po sekundzie od wpisania ostatniej litery? I załóżmy że mając tabelę id_miasta | nazwa to id_miasta wiadomo będzie PRIMARY a "nazwa" będzie jako full text?
ayeo
Witaj!

W Polsce jest ok 52k wszystkich miejscowości (włącznie z najmniejszymi wsiami). Taka baza waży około 2MB więc to pikuś dla każdej bazy. Kwestia indeksów.

Pozdrawiam!
maniak11
W polsce jest dokładnie 2x tyle co napisałeś czyli ponad 100 tyś. miejscowości. looknij sobie tutaj: http://www.stat.gov.pl/broker/access/prefi...stPreFiles.jspa (może komuś się przyda przy okazji)
ayeo
Może być nawet i pół miliona, bez znaczenia tutaj. Jednak jest dokładnie 53236.

Pozdrawiam!
dr_bonzo
Cytat
@dr_bonzo: dzięki za odp. - ja to wszystko wiem, tylko nie wiem po prostu jak szybko to będzie działać przy tak dużej ilości rekordów, czy podpowiedzi pokażą się powiedzmy po sekundzie od wpisania ostatniej litery? I załóżmy że mając tabelę id_miasta | nazwa to id_miasta wiadomo będzie PRIMARY a "nazwa" będzie jako full text?


No to ja bardzo chetnie utworze sobie bazke z miejscowosciami, zrobie skrypt z autocomplete, i potestuje jak szybko to sie pobiera przy roznych ilosciach userow na sekunde itd.

A potem ci rachunek wystawie, co?
Crozin
id: INT NOT NULL AUTO_INCREMENT PRIMARY KEY
nazwa: VARCHAR(60) NOT NULL INDEX

Przy czym sprawdź sobie jaka długość VARCHARa będzie odpowiednia, bo 60 może być za mało, za dużo lub w sam raz.
Fifi209
Cytat(Crozin @ 1.08.2009, 16:58:00 ) *
id: INT NOT NULL AUTO_INCREMENT PRIMARY KEY
nazwa: VARCHAR(60) NOT NULL INDEX

Przy czym sprawdź sobie jaka długość VARCHARa będzie odpowiednia, bo 60 może być za mało, za dużo lub w sam raz.


Do i dodałbym atrybut unsigned
Crozin
Myślisz, że będzie miał ponad 2 mld miast? winksmiley.jpg
Na szybkość wyszukiwania to nie wpłynie.
Fifi209
Cytat(Crozin @ 1.08.2009, 17:32:57 ) *
Myślisz, że będzie miał ponad 2 mld miast? winksmiley.jpg
Na szybkość wyszukiwania to nie wpłynie.


Co ma do tego ilość miast? smile.gif

Poza tym ktoś pisał o wartościach rzędu 53k, w takim przypadku znacznie lepiej zastosować: smallint unsigned, który przyjmie max ~65k (nie pamiętam dokładnie)
Warto myśleć o optymalnych rozwiązaniach a nie zajmować cenne miejsce w bazie, którego nigdy nie wykorzystamy.
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.