Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> szybkość działania dużych baz danych
hobibit
post 7.11.2009, 07:55:49
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

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


Nie wiem czy dobrze mi się wydaje czy gdzieś w kodzie może błąd popełniłem.
Zdaje się że duże bazy danych działają dużo, dużo wolniej.
Mam kawałek skryptu php który pobiera jeden rekord z bazy mysql.
Jeśli baza m jeden rekord wszystko idzie szybko (przykładowo jeden, może być że 100), kiedy ma natomiast 10 milionów idzie powolnie. Normalna sprawa, ma więcej rekordów do przejrzenia itp.
Czy jest jakiś sposób żeby działało to tak samo szybko przy dużych bazach albo przynajmniej nie strasznie wolno.
Cashowanie nie zadziała bo dan są cały czas zmieniane
Nie wiem czy LIMIT 1, zadziała tak ze po znalezieniu przestanie dalej szukać, ale to zadziała tylko gdy rekordy będą z 'przodu' bazy danych.
Czy są jakieś sposoby na to?
Może zmiana bazy danych na jakiąś inną, ale z innymi nie mam doświadczenia więc proszę o rade która dobrze się sprawdza z dużymi bazami danych.
Go to the top of the page
+Quote Post
maly_swd
post 7.11.2009, 12:37:50
Post #2





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


1. struktura bazy
2. odpowiednie typy danych
3. odpowiednia dlugos pol
4. indexy
5. optymalne zapytanie

juz na wstepie widac ze 5 pkt nie przestrzegasz:)... Twoje pytanie o tym swiadczy.. skoro my nie wiemy o co pytasz "brak przykladu", to pomysl co ta biedna baza danych ma zrobic jak jej zadajesz podobne zapytanie jak tu na forum:D


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
hobibit
post 7.11.2009, 23:09:19
Post #3





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

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


Baza jest zbudowana w miare dobrze, zapytania są dobrze sformułowane. Nie o to mi chodzi czy coś dobrze napisałem czy nie, i nie tak brzmiało pyranie. Stwórz sobie tablice w mysql-u która będzie miała 100 MB wielkości i sprubuj wyciągnąć z niej 1000 rekordów, zajmie to wieczność. Co zrobić żeby działało to szybciej? Nie chodzi konkretnie o jeden przykład ale o 'teorię'. Ktoś mi powiedział że bazy postgresql poradzą sobie z dużymi bazami danych. Nie wiem czy tak jest czy nie bo działałem tylko na bazach mysql, wiec jak jest naprawde, czy te postgresql bazy danych radzą sobie dobrze z dużymi bazami danych ?
Go to the top of the page
+Quote Post
wookieb
post 7.11.2009, 23:55:26
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(hobibit @ 7.11.2009, 23:09:19 ) *
Stwórz sobie tablice w mysql-u która będzie miała 100 MB wielkości i sprubuj wyciągnąć z niej 1000 rekordów,

Tabelę. Spróbuj. Zajmie to 1/1000 sekundy. Test na bazie 400 MB ponad 800 tys rekordów, indeks na szukane pole i zapytanie typu LIKE '%a%' Wykonane w 0,00012 sekundy. Oczywiście przeanalizowanie takiej ilość rekordów przez skrypt jest dłuższe ale bardzo rzadko zdarza się sytuacje, że tyle rekordów potrzeba bardzo szybko "przetrzepać" przez skrypt.

Cytat(hobibit @ 7.11.2009, 23:09:19 ) *
Nie wiem czy tak jest czy nie bo działałem tylko na bazach mysql, wiec jak jest naprawde, czy te postgresql bazy danych radzą sobie dobrze z dużymi bazami danych ?

Tak. Lepiej sobie radzi z takimi bazami danych aczkolwiek nie pamiętam jak to jest dokładnie z prędkością. Mogło się dużo zmienić od ostatnich czasów. Powiedz co masz za bazę i co w niej trzymasz.

Ten post edytował wookieb 8.11.2009, 00:19:14


--------------------
Go to the top of the page
+Quote Post
maly_swd
post 8.11.2009, 11:52:06
Post #5





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


pokaz strukture tabeli/bazy oraz pokaz jakie zapytanie robisz.
U mnie na bazie okolo 15milionow rekordow wyszzukiwanie z JOINAMI trwa okolo 0,05-0,2sek



--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
hobibit
post 9.11.2009, 09:32:20
Post #6





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

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


Więc z pewnością gdzieś błąd zrobiłem ale za chiny nie wiem gdzie.
id int(8)
id_mapa int(3)
wnetrze_budynku int(2)
x int(5)
y int(5)
typ tinyint(2)
grafika varchar(5) latin1_swedish_ci
w_pn tinyint(1)
w_ws tinyint(1)
w_pd tinyint(1)
w_za tinyint(1)
surowiec tinyint(2)
surowiec_nazwa varchar(30) latin1_swedish_ci
surowiec_st tinyint(1)
surowiec_wsp1 varchar(15) latin1_swedish_ci
surowiec_wsp2 varchar(15) latin1_swedish_ci
surowiec_mod tinyint(3)
fabryka tinyint(2)
id_budynek int(6)
budynek_typ int(2)
budynek_gracz int(7)
budynek_grafika varchar(1) latin1_swedish_ci
id_gracz int(6)
grafika_gracz smallint(4)
front tinyint(1)
zwrot tinyint(1)
szerokosc tinyint(1)
dlugosc tinyint(1)
czas int(11)
obiekt_1 int(5)
obiekt_2 int(5)
obiekt_3 int(5)
obiekt_4 int(5)

Zapytanie php wygląda tak:
  1. $calaWidocznaMapa = mysql_query('SELECT x,y,id_gracz,grafika,grafika_gracz,zwrot,obiekt_1,obiekt_2,obiekt_3,obiekt_4 FROM mapa WHERE id_mapa="'.$pierwszePole['id_mapa'].'" AND x>="'.$X_min.'" AND x<="'.$X_max.'" AND y>="'.$Y_min.'" AND y<="'.$Y_max.'" ');


Z całego skryptu wszystkie pozostałe zapytania usunąłem, nic więcej praktycznie nie ma (1,2 ale małe).
Zawsze pobieram taką samą ilość rekordów, zawsze. Zawsze robie z nimi dokładnie to samo, ten sam skrypt.
Kiedy w tablicy jest 1000 rekordów wszystko śmiga, kiedy jest 1000000 żółwi się strasznie mimo że niby pokazuje za operacja zajmuje mu najwyżej sekunde.
Go to the top of the page
+Quote Post
thek
post 9.11.2009, 09:48:22
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zzacznij może od zmiany x> a AND x < b na Between dla x i y. id_mapa powinien mieć indeks i zastanawiałbym się nad tym czy te x, y też nie walnąć do indeksów.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
wookieb
post 9.11.2009, 09:52:01
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Pisałem, że przeanalizowanie takiej ilość rekordów (pobranie, wrzucenie do tablicy (broń boże do obiektu)) jest znacznie dłuższe. Widzę, że jest to skrypt mapy ale powiedz mi proszę dlaczego pobierasz aż tyle rekordów?


--------------------
Go to the top of the page
+Quote Post
hobibit
post 9.11.2009, 10:17:54
Post #9





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

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


Dane są następnie do tablicy wrzucane a potem wszystkie są drukowane, dlatego aż tyle.
Problem jest taki że ten sam skrypt działa szybko dość na małych bazach mimo że pobiera tyle samo rekordów i tak samo je przerabia a przy większej bazie się gubi.
Go to the top of the page
+Quote Post
nospor
post 9.11.2009, 10:21:13
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




no to ci napisano przeciez:
zaloz indexy na pola: x, y oraz id_mapa

Dodatakowo skoro to są liczby (x,y, id_mapa) to nie bierz ich w apostrofy. Liczba to liczba a nie tekst.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hobibit
post 9.11.2009, 11:20:16
Post #11





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

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


Zrobiłem jak radziliście, działa faktycznie szybciej.
Ale cały czas widze że w bazie jest 1000 rekordów działa to 4 razy szybicej niż przy 2000000 rekordów. Sprawa jasna ale może macie jakieś inne pomysły na przyspieszenie działania.
Go to the top of the page
+Quote Post
nospor
post 9.11.2009, 11:22:03
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




no ale jakiego to są teraz rzędu czasy?
1000 - 0.001 s
2000000 - 0.004 s
?
No to naprawdę nie masz juz co sie martwic winksmiley.jpg


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
phpion
post 9.11.2009, 11:35:38
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(nospor @ 9.11.2009, 12:21:13 ) *
zaloz indexy na pola: x, y oraz id_mapa

Wydaje mi się, że lepiej sprawdziłby się tutaj 1 indeks założony na te 3 kolumny (w kolejności: id_mapa, x, y). W zapytaniu kolega i tak wyciąga rekord właśnie po takim warunku i w takiej kolejności, a przynajmniej odpadłby narzut aktualizacji 3 indeksów po zmianie danych w bazie. Przy SELECT pewnie różnicy by nie było widać, ale przy INSERT/UPDATE/DELETE już chyba tak. Myślę, że warto spróbować.
Go to the top of the page
+Quote Post
Ges
post 16.11.2009, 18:43:04
Post #14





Grupa: Zarejestrowani
Postów: 61
Pomógł: 9
Dołączył: 22.02.2008

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


Ja ze swojej strony polecam trochę bardziej rozbudowane koncepcje na duże bazy danych:

- cachowanie (nie jest to rozwiązanie na bazie danych, ale może znacznie przyspieszyć odczyt danych pobieranych z bazy, poprzez cachowanie odpowiedzi bazy) np:. memcache

- replikacje (dublowanie baz danych w celu zrównoleglenia zapytań do poszczególnych duplikatów)
W tym rozwiązaniu masz 1 serwer MASTER na którym robisz UPDATE i odpowiednią ilość SLAVE które służą do odczytu danych. Również pomaga w odczytywaniu, ale już na poziomie bazy. Przy dynamicznych danych i małym hit rate cache, może się przydać.

- do INSERTów do baz danych jedynie klaster może Ci pomóc. Ale to rozwiązanie raczej nie będzie Ci potrzebne...

Oczywiście wszystkie z moich propozycji należy rozważyć po tym jak zoptymalizujesz już strukture swojej bazy (indexy + tabele) i dalej będziesz miał problemy z wydajnością. Z tego co widzę w tym wątku dużo rzeczy można u Ciebie poprawić jeszcze na etapie 1 bazy.

SELECTy i opisy "U mnie na bazie okolo 15milionow rekordow wyszzukiwanie z JOINAMI trwa okolo 0,05-0,2sek" sprawdzają się w 100% w momencie gdy nie masz około 100 zapytań / sekunde spowodowanych ogromną ilością użytkowników.\

Może moja propozycja jest na wyrost, a może komuś sie przyda...
Go to the top of the page
+Quote Post

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: 24.06.2025 - 12:53