Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Bardzo duża ilości zapytań - jak rozwiązać problem nie tracąc funkcjonalności
adam1024
post 26.05.2015, 18:41:16
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 13.02.2009

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


Posiadam bazę danych miejscowości (+/- 50 000 rekordów ) oraz wyszukiwarkę która w czasie rzeczywistym wykonuje zapytania ( poprzez AJAX'a ).
Zapytanie jest wykonywane do bazy przy każdym keyupie , oraz w jednym czasie są wykonywane 3 zapytania ( ze względu na to że najpierw zależy mi aby były wyświetlane wszystkie miasta które są stolicami województw, a później te które występują w danym województwie (a mają podobną, taką samą nazwę) a na końcu wszystkie inne miasta mające taką samą nazwę.

W jaki sposób mogę zoptymalizować zapytanie do bazy i zmniejszyć ilość zapytań by nie stracić na funkcjonalności.

Ten post edytował adam1024 26.05.2015, 18:43:55


--------------------
Lubisz okazje i promocje? Wbij na HotShops.pl z mojego refa i pozwól zdobyć mi pkt. ;)
Go to the top of the page
+Quote Post
ctom
post 26.05.2015, 19:13:41
Post #2





Grupa: Zarejestrowani
Postów: 321
Pomógł: 55
Dołączył: 19.04.2009

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


skoro piszesz, że +/- masz skończoną ilość rekordów (lub przynajmniej często nie rotują) to przemyśl i zaplanuj cacheowanie zapytań


--------------------
Polecam MyDevil hosting idealny dla deweloperów
Go to the top of the page
+Quote Post
sazian
post 26.05.2015, 20:10:02
Post #3





Grupa: Zarejestrowani
Postów: 1 043
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


w tabeli zapewne masz kolumnę informującą w jakim województwie jest dane miasto oraz czy jest jego stolicą więc zapewne zamiast trzech zapytań wystarczy sortowanie. Ale trudno coś więcej powiedzieć nie wiedząc jak wygląda baza i jaki dokładnie efekt chcesz osiągnąć.

Jak mniemam problemem jest to że zapytania są za wolne ? Więc może są one nieoptymalne ?
Go to the top of the page
+Quote Post
Pyton_000
post 26.05.2015, 21:21:05
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Poza tym dodaj opóźnienie na keyup żeby nie szło zapytanie po każdej literce a np. po 300ms niepisania, wtedy pisząc szybciej początek nazwy wyszuka Ci od razu prawie kompletną informację.
Go to the top of the page
+Quote Post
adam1024
post 26.05.2015, 21:27:32
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 13.02.2009

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


Nie posiadam informacji o tym czy dane miasto jest stolicą, takie rzeczy sprawdzam w switchu po stornie php ( jest x warunków tak żeby przekierować konkretnie zapytanie jeśli przekazana wartość to np. Kraków wtedy przekazuję województwo-> małopolskie, powiat -> kraków, miasto ->kraków. Zapytania są jak najbardziej w porządku, bardzo szybko się wykonują, jednak jest ich bardzo dużo z racji tego że wykonują się one na żywo...

czyli w przypadku gdy użytkownik wpisuje słowo kraków, mamy 6 zapytań ( bo tyle jest liter ):
1-> k
2-> kr
3-> kra
4-> krak
5-> krakó
6-> kraków

do tego wykonanie 3 zapytań czyli:
1: jeśli przeleci przez switcha w php ( czyli miasto jest stolicą ) -> zapytanie o wynik
2: kolejne zapytanie to wyszukiwanie innego krakowa z województwa małopolskiego
3: i jeszcze jedno zapytanie to wyszukanie innego krakowa z poza województwa małopolskiego

co w sumie na jedno zapytanie daje 6*3 =18 zapytań... oraz przy kasowaniu frazy ( keyup ) też działa ten sam mechanizm tylko od tyłu... więc to daje kolejne 18 zapytań

i jak tutaj dokonać optymalizacji tego, zostawiając całkowitą funkcjonalność?


--------------------
Lubisz okazje i promocje? Wbij na HotShops.pl z mojego refa i pozwól zdobyć mi pkt. ;)
Go to the top of the page
+Quote Post
Skie
post 26.05.2015, 21:31:32
Post #6





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


1. Dodaj cache'owanie wyników z bazy danych - np takie rzeczy jak stolice przecież się nie zmienieją prędko, możesz spokojnie zapamiętywać
2. Zainteresuj się cache'owaniem HTTP i/lub reverse proxy
3. Pomyśl, może warto zrobić cache po stronie frontu
4. Dodaj opóźnienie na keyup, niech request wysyła się po jakimś czasie od wciśnięcia klawisza, nie od razu
5. Mówisz, że masz 3 requesty + PHP po środku - przerób to na 1 request


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
Xelah
post 27.05.2015, 06:59:51
Post #7





Grupa: Zarejestrowani
Postów: 139
Pomógł: 24
Dołączył: 12.05.2013
Skąd: Hamburg

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


Jeszcze odnośnie samego zapytania. Jeśli wyszukujesz tylko nazwy miast począwszy od pierwszej litery (czy nie masz wildcard % na początku zapytania), to upewnij się, że masz indeks przynajmniej na 3-4 pierwsze znaki.
Go to the top of the page
+Quote Post
adam1024
post 27.05.2015, 07:38:42
Post #8





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 13.02.2009

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


Kod
$query= "SELECT DISTINCT SQL_CACHE woj, pow, msc FROM miasta WHERE pow <> '$pow' AND msc LIKE %s ORDER BY woj ASC, msc ASC LIMIT 500 ";


indeksów raczej nie mam a już napewno nie na 3 pierwsze znaki


--------------------
Lubisz okazje i promocje? Wbij na HotShops.pl z mojego refa i pozwól zdobyć mi pkt. ;)
Go to the top of the page
+Quote Post
Turson
post 27.05.2015, 07:43:49
Post #9





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Moja propozycja jest taka, żebyś nie odpytywał bazy co znak, a zaciągnął wszystkie dane po pierwszym odpytaniu, zapisał do tablicy i w niej wyszukiwał
Go to the top of the page
+Quote Post
adam1024
post 27.05.2015, 07:48:11
Post #10





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 13.02.2009

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


Turson teraz odpytuję co 3 s. po ostatnim keyupie, więc ilość zapytań troszkę się zmniejszy


--------------------
Lubisz okazje i promocje? Wbij na HotShops.pl z mojego refa i pozwól zdobyć mi pkt. ;)
Go to the top of the page
+Quote Post
Xelah
post 27.05.2015, 08:14:35
Post #11





Grupa: Zarejestrowani
Postów: 139
Pomógł: 24
Dołączył: 12.05.2013
Skąd: Hamburg

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


Cytat(adam1024 @ 27.05.2015, 08:38:42 ) *
Kod
$query= "SELECT DISTINCT SQL_CACHE woj, pow, msc FROM miasta WHERE pow <> '$pow' AND msc LIKE %s ORDER BY woj ASC, msc ASC LIMIT 500 ";


indeksów raczej nie mam a już napewno nie na 3 pierwsze znaki


Nie wiem co jest w %s więc nie wiem czy indeks ma sens czy nie. Pytanie jest proste. Masz wildcard (%) na początku szukanego ciągu znaków czy nie.

Jeśli to Twoja baza to chyba wiesz, czy masz na kolumnie indeks czy nie...
Go to the top of the page
+Quote Post
adam1024
post 27.05.2015, 08:36:21
Post #12





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 13.02.2009

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


nie mam % na początku szukanego ciągu znaków, na kolumnie msc indeksu też nie posiadam


--------------------
Lubisz okazje i promocje? Wbij na HotShops.pl z mojego refa i pozwól zdobyć mi pkt. ;)
Go to the top of the page
+Quote Post
Xelah
post 27.05.2015, 09:00:00
Post #13





Grupa: Zarejestrowani
Postów: 139
Pomógł: 24
Dołączył: 12.05.2013
Skąd: Hamburg

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


W takim razie, przy 50k rekordach ma sens dodać indeks na kolumnie msc. Coś a'la:

CREATE INDEX mst_idx ON miasta (mst (4));

Możesz poeksperymentować z różnymi długościami. Przy czym do jest tylko detal i jak napisali poprzednicy skup się na usprawnieniach po stronie frontendu.
Go to the top of the page
+Quote Post
sazian
post 27.05.2015, 20:12:12
Post #14





Grupa: Zarejestrowani
Postów: 1 043
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


LIKE ignoruje indeksy
Go to the top of the page
+Quote Post
adam1024
post 28.05.2015, 06:31:26
Post #15





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 13.02.2009

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


mam jeszcze jedno pytanie
muszę wybrać jedną wartość z bazy tak jakby główną która będzie na samej górze ( jest to jedna pozycja która wynika z wcześniej przypisanej zmiennej ) oraz później wypisać resztę pozycji poza tą jedną ( już wcześniej wypisana ) - czy lepiej to zrobić na 2 osobnych zapytaniach czy może pobrać wszystkie wartości z bazy a później sprawdzać te warunki podczas wypisywania?


--------------------
Lubisz okazje i promocje? Wbij na HotShops.pl z mojego refa i pozwól zdobyć mi pkt. ;)
Go to the top of the page
+Quote Post
Pyton_000
post 28.05.2015, 06:49:48
Post #16





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Cytat(sazian @ 27.05.2015, 21:12:12 ) *
LIKE ignoruje indeksy

Doprawdy?
http://sqlfiddle.com/#!9/cd95de/1
Go to the top of the page
+Quote Post
Xelah
post 28.05.2015, 06:56:34
Post #17





Grupa: Zarejestrowani
Postów: 139
Pomógł: 24
Dołączył: 12.05.2013
Skąd: Hamburg

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


Cytat(sazian @ 27.05.2015, 21:12:12 ) *
LIKE ignoruje indeksy


http://dev.mysql.com/doc/refman/5.0/en/index-btree-hash.html

Chyba, że mówimy o jakiejś innej bazie... ale od samego początku odnoszę wrażenie, że jednak o MySQL :)
Go to the top of the page
+Quote Post
pasman
post 29.05.2015, 09:54:16
Post #18





Grupa: Zarejestrowani
Postów: 70
Pomógł: 4
Dołączył: 16.03.2012

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


Cytat(Xelah @ 28.05.2015, 07:56:34 ) *



no przecież tu piszą że używa..


The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that does not start with a wildcard character.


Ten post edytował pasman 29.05.2015, 09:56:22
Go to the top of the page
+Quote Post
Crozin
post 29.05.2015, 10:15:17
Post #19





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

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


Może pomyśl nad wykorzystaniem narzędzia typu Apache Solr, które zdecydowanie lepiej radzi sobie z tego typu zadaniami niż jakakolwiek relacyjna baza danych? W użyciu w sumie bardzo proste narzędzie. Dodatkowo będziesz mógł na potrzeby podpowiadania w ogóle zrezygnować z PHP jako pomostu pomiędzy danymi, a użytkownikiem.
Go to the top of the page
+Quote Post
Pyton_000
post 29.05.2015, 11:25:51
Post #20





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


To chyba armata na komara. Wydajnościowo powinno wystarczyć zwyczajne rozwiązanie.

Choć tu można się zastanowić nad optymalizacją struktury tak aby używać mniejszej ilości zapytań.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 18:34