![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 235 Pomógł: 0 Dołączył: 26.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam baze która 'waży' 1MB (około 4 000 rekordów) i generuje transfer 1-2 GB dziennie, gdy przełącze baze na drugą (identyczna struktura), z tym że o większym rozmiarza - 5MB (około 23 000 rekordów) transfer skacze do nieprawdopodobnego poziomu około 80GB na dobę ! Co może być przyczyną takiego stanu rzeczy ? |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Pobierasz liczbę rekordow poprzez pobranie ich wszystkich i zliczenie ile ich jest. powinienes uzyc count() (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
To tylko przyklad. edit: kolejny przyklad: Nie uzywasz stronicowania tylko wyswietlasz na stronie wszystkie dane z tabeli. I juz masz swoj przyrost transferu |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 235 Pomógł: 0 Dołączył: 26.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Użuwam count.
Mógłbyś rzucić okiem na ten kod:
Można by tutaj coś poprawić (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) To jest jakaś masakra z tym transferem, jakby każde zapytanie do bazy pobierało za każdym razem całą baze ... |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
W tym kodzie nie widze nie niepokojącego, nie licząc tych cudnych nazw zmiennych (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#5
|
|
Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Taki transfer na pewno jest generowany w zupełnie innym fragmencie kodu, niż nam pokazałeś. Czy ty przypadkiem nie trzymasz w bazie jakiś obrazków czy czegoś podobnego?
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 4 Dołączył: 7.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
nospor ma racje, uzywaj COUNT a ty nie uzywasz, zamiast tego generujesz transfer przez mysql_num_rows()
poczytaj http://skrypta.pl/porada/dlaczego_unikac_f...sql_num_rows/43 ta funkcja przesyla po raz kolejny wszystkie rekordy i je zlicza a tobie potrzbena jest tylko jedna liczba - ilosc rekordow zatem uzyj mysql'owego COUNT(*) i wykonaj dodatkowe zapytanie ktore zwroci tylko jeden rekord - liczbe rekordow najlepiej to w ogole nie wysylac zapytania (chyba ze z jakis powodow musisz) i sprawdzac czy inkrementowana zmienna np $ilosc_rekordow jest wieksza niz 8, inkrementuj ja przy kazdym wyswietleniu rekordu z tabeli, tym sposobe uzyskasz ilosc rekordow twoj transfer generuje sie pewnie przez ta funkcje mysql_num_rows ktora powoduje ze kazdy zestaw rekordow przesylany jest dwukrotnie do skryptu - ale nie widze reszty kodu wiec porblemow moze byc wiecej |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 235 Pomógł: 0 Dołączył: 26.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
W bazie nie mam żadnych obrazków ani nic w tym klimacie.
Schemat głównej tabeli wygląda tak: id int(7) tytul varchar(50) dlugosc varchar(30) link varchar(200) data date czas varchar(20) rozmiar varchar(30) licznik int(10) Skoro w tamtym pliku nie ma nic podejrzanego to może w pliku header.php dołączanym do większosći plików. Kod trochę robiony na chłopski rozum przez to przydługi (głównie z powodu przełączania się na 2 baze w wypadku problemów z podstawową), no ale tyko tak umiałem :/
|
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
$result = mysql_query("SELECT * FROM $tabelka ");
$razem = mysql_num_rows($result); Przeciez tu pobierasz wszystkie dane. A mowiles ze uzywasz COUNT... |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 732 Pomógł: 80 Dołączył: 25.05.2005 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
a co to i po co ?:
EDIT: @nospor, byłeś szybszy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował sniezny_wilk 29.05.2008, 13:24:03 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 235 Pomógł: 0 Dołączył: 26.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Do guitarnet.pl
Dopiero przeczytałem Twojego posta. Spróbuje się zastosować do Twoich porad, tylko pewnie zajmie mi to (z moim doświadczeniem) trochę czasu :/ P.S. Jak myślisz ile w ten sposób mogę zaoszczędzić jeśli chodzi o transfer ? Pewnie w 2 fragmenice wypadałoby zrobić analogiczne poprawki. $result = mysql_query("SELECT * FROM $tabelka "); $razem = mysql_num_rows($result); Przeciez tu pobierasz wszystkie dane. A mowiles ze uzywasz COUNT... Heh, no tu rzeczywiście chyba chodziło tylko o liczbę rekordów. No to ciekawe, czy to tutaj jest pies pogrzebany i czy to przez to generuje mi taki kosmiczny transfer. Chciałbym, żeby tak było, ale coś czuje że jeszcze gdzieś może być coś nie tak. Zobaczymy czy mi tym razem (wyjątkowo) nie zablokują konta w netarcie za przekroczenie limitu transferu :-) Dzięki wielkie za pomoc wszystkim (IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif) ! |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 4 Dołączył: 7.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
ciezko powiedziec ile zaoszczedzisz ale na pewno znaczaco zoptymalizujesz
sprobuj tez stale polaczenie do bazy, dodatkowo ob_start i funkcje do usuwania bialych znakow z bufora, \t \n \r wielokrotne spacje itp to naprawde sporo tnie transfer w tym kodzie nie widac innych generujacych transfer problemow, zastanow sie tez czy nie warto przechowywac w pliku php wyniku COUNT() zamiast wykonywac go z kazda odslona, mozna odswiezac np co 1 godzine jak czesto sie zmienia, ale to bardzie ulzy bazie anizlei pomoze transferowi moze inni maja wiecej pomyslow bo moich byloby na tyle (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.09.2025 - 05:19 |