Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Szybkie przeszukiwanie dużych ilości danych co wybrać?
maniak11
post
Post #1





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 18.03.2006
Skąd: Sosnowiec

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam wszystkich
Go to the top of the page
+Quote Post
fander
post
Post #2





Grupa: Zarejestrowani
Postów: 231
Pomógł: 22
Dołączył: 6.10.2008

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


przy złożonej bazie zalecam użycie postgresa, jest dużo bardziej wydajniejszy niż mysql w kontakcie ze złożonymi zapytaniami
Go to the top of the page
+Quote Post
janusz85
post
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 5
Dołączył: 29.07.2009

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


Na pewno nie XML, zanim go sparsujesz to wieki miną. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
maniak11
post
Post #4





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 18.03.2006
Skąd: Sosnowiec

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


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. ?>


?
Go to the top of the page
+Quote Post
Fifi209
post
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Zapisz w postaci zserializowanej tablicy w cache. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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.

Ten post edytował dr_bonzo 31.07.2009, 14:05:42
Go to the top of the page
+Quote Post
maniak11
post
Post #7





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 18.03.2006
Skąd: Sosnowiec

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


@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?
Go to the top of the page
+Quote Post
ayeo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


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!
Go to the top of the page
+Quote Post
maniak11
post
Post #9





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 18.03.2006
Skąd: Sosnowiec

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


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)
Go to the top of the page
+Quote Post
ayeo
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Może być nawet i pół miliona, bez znaczenia tutaj. Jednak jest dokładnie 53236.

Pozdrawiam!
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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?
Go to the top of the page
+Quote Post
Crozin
post
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
Fifi209
post
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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
Go to the top of the page
+Quote Post
Crozin
post
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Myślisz, że będzie miał ponad 2 mld miast? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Na szybkość wyszukiwania to nie wpłynie.
Go to the top of the page
+Quote Post
Fifi209
post
Post #15





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(Crozin @ 1.08.2009, 17:32:57 ) *
Myślisz, że będzie miał ponad 2 mld miast? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Na szybkość wyszukiwania to nie wpłynie.


Co ma do tego ilość miast? (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował fifi209 1.08.2009, 17:55:05
Go to the top of the page
+Quote Post

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: 17.09.2025 - 22:34