Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Geometryczny wzrost transferu w stosunku do wielkości bazy, Skąd takie wielkie różnice ?
majestiq
post
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 ?
Go to the top of the page
+Quote Post
nospor
post
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
Go to the top of the page
+Quote Post
majestiq
post
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:

  1. <?php
  2. if($_GET['id'] == 'szukaj') {
  3. echo '<div id="bg">
  4. <div id="page">
  5. <div id="content" style="overflow:hidden;">'; //style="border: 1px solid #000; height:2000px;"
  6.  
  7. if( $_POST['wykonawca'] )
  8. $wykonawca=$_POST['wykonawca'];
  9. else if( $_GET['wykonawca'] )
  10. $wykonawca=$_GET['wykonawca'];
  11.  
  12. //$czas1=microtime();
  13. if( $_POST['wykonawca'] ) {
  14.  
  15. $dodaj = mysql_query("INSERT INTO `szukark` ( `id` , `nazwa` ) VALUES ( '', '$wykonawca' );");
  16. }
  17.  
  18. $sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE '%'.$wykonawca.'%' ORDER by tytul LIMIT 50 ';
  19. //$czas2=microtime(); 
  20. //$czas=$czas2-$czas1; 
  21.  //echo $czas;
  22.  
  23. $result123 = mysql_query($sql);
  24.  
  25.  
  26. $rekordow = mysql_num_rows($result123); 
  27. $rek = '';
  28. if($rekordow == 50) { $rek = '<span style="line-height:10px; margin-top:10px; color:#ff0000;"> (ograniczenie)</span>'; }
  29.  
  30. echo ' <span style="margin-top:7px; float: left;"><br />Szukana fraza: <b>'.$wykonawca.'</b> // znaleziono '.$rekordow.' rekordĂłw'.$rek.'</span>';
  31.  
  32.  
  33.  
  34. if(mysql_num_rows($result123) > 0) {
  35.  
  36.  
  37. while($row123 = mysql_fetch_assoc($result123))
  38. {
  39. $rowaqwe = tytul($row123['tytul']);
  40.  
  41.  if ($row123['dlugosc'] == '') {
  42. $zmexpl = $row123['rozmiar'];
  43. $expl = explode('|', $zmexpl);
  44. //echo $expl[1].' - '.$expl[0]; 
  45.  
  46. $expl[0] = str_replace("<b>", "",$expl[0]);
  47. $expl[0] = str_replace("</b>", "",$expl[0]);
  48.  
  49.  
  50.  
  51. echo '
  52. <div class="result" >
  53. <br /><a title="'.$row123['tytul'].'" class="title" style="font-weight: bold;" href="mp3,'.$row123['id'].','.$rowaqwe.'.html">'.$row123['tytul'].'</a><br>
  54. <b>Rozmiar</b>: '.$expl[1].' . <b>Czas</b>: '.$expl[0].' . <b>Pobrano</b>: '.$row123['licznik'].
  55. </div> 
  56. '; 
  57.  
  58. }
  59.  
  60.  
  61.  
  62.  
  63. else {
  64.  
  65.  
  66. //print_r ($row123);
  67. echo '
  68. <div class="result" >
  69. <br /><a title="'.$row123['tytul'].'" class="title" style="font-weight: bold;" href="mp3,'.$row123['id'].','.$rowaqwe.'.html">'.$row123['tytul'].'</a><br>
  70. <b>Rozmiar</b>: '.$row123['rozmiar'].' . <b>Czas</b>: '.$row123['dlugosc'].' . <b>Pobrano</b>: '.$row123['licznik'].
  71. </div> 
  72. '; 
  73. }
  74.  
  75.  
  76.  
  77.  
  78.  }
  79.  
  80.  
  81.  
  82. if(mysql_num_rows($result123) < 8) { echo '<div style="height:500px;"></div>';}
  83. ?>


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 ...
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
scanner
post
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?
Go to the top of the page
+Quote Post
guitarnet.pl
post
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
Go to the top of the page
+Quote Post
majestiq
post
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 :/

  1. <?php
  2.  
  3. error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE );
  4.  
  5.  
  6. function data()
  7. {
  8. $data= date ('w'); // dzien tygodnia liczbowo
  9. $rok= date ('Y'); // rok
  10. $godzina= date ('H:i'); // godzina
  11. $dzien = date ('d'); // dni
  12. $miech = date ('n'); // miesiac
  13. $data = $godzina.' '.$dzien.'-'.$miech.'-'.$rok;
  14. return $data;
  15. }
  16. function cgs()
  17. {
  18. $czas = explode(" ", microtime());
  19. $a = (double)$czas[0];
  20. $b = (double)$czas[1];
  21. return $a + $b;
  22. }
  23. $start = cgs();
  24. $data=data();
  25.  
  26. $db_danee["hostname"] = "xxxxxl"; // nasz host, najczęsciej jest to localhost
  27. $db_danee["user"] = "xxxxx"; // nasz login do bazy
  28. $db_danee["password"] = "xxxxx; // nasze hasło do bazy
  29. $db_danee["db"] = "xxxxx"; // nazwa naszej bazy danychh
  30.  
  31. $connection = mysql_connect($db_danee['hostname'], $db_danee['user'], $db_danee['password']);
  32. @mysql_select_db($db_danee['db']);
  33. $sqltest="SELECT * FROM `mp3` LIMIT 1"; 
  34. $res = mysql_query ($sqltest); 
  35. $res = mysql_fetch_array ($res);
  36. //echo '1';
  37. //print_r ($res);
  38.  
  39. //echo $res[1];
  40.  
  41. if ($res != 0) {
  42.  
  43.  
  44.  
  45. require_once('conf.php');
  46. require_once('funkcje.php');
  47. polaczenie();
  48.  
  49.  
  50. // wyœwietlasz stronę
  51.  
  52. //require_once('Pager.class.php');
  53. $result = mysql_query("SELECT * FROM $tabelka ");
  54. $razem = mysql_num_rows($result); 
  55. $sql12="SELECT * FROM `$tabelka` WHERE id = '$down'"; 
  56. $result12 = mysql_query ($sql12) 
  57.  or die ("bład zapytania select"); 
  58. $row12 = mysql_fetch_array ($result12);
  59. if (isset($_GET['down']) && $_GET['down'] == $row12['id'] && $_GET['download'] == $row12['id'])
  60. {
  61.  
  62. $query = "SELECT * FROM mp3 WHERE id = '$download';"; // tutaj wybieramy "plik" z tabeli który został podany w nagłówku warunek.
  63. $wynik = mysql_query ($query); // wykonanie powyższej linii
  64.  $dane = mysql_fetch_array ($wynik);
  65.  $licznik = $dane[licznik];
  66.  $url = $dane[link];
  67. // Przypisanie rekordów do zmiennych.
  68. header("location: $url"); // Œcišga plik z podanego URL.
  69. $query = "UPDATE mp3 SET licznik = licznik+1 WHERE id='$download';"; // zlicza œcišgnięcia
  70. $wynik = mysql_query ($query); // wykonuje powyższa linijkę kodu
  71. return $licznik+1;
  72. }
  73. echo '
  74. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  75. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  76. <head>';
  77. $sql12="SELECT * FROM `$tabelka` WHERE id = '$id' "; 
  78. $result12 = mysql_query ($sql12) 
  79.  or die ("bład zapytania select"); 
  80. $row12 = mysql_fetch_array ($result12);
  81. if(isset($_GET['id']) && $_GET['id'] == $row12['id']) {
  82. echo '
  83. <title>'.$row12['tytul'].' - '.$tytul_strony.'</title>
  84. <meta name="description" content="'.$row12['tytul'].' - '.$desc.'">
  85. <meta name="keywords" content="'.$row12['tytul'].' - '.$keywords.'">
  86. ';
  87. }
  88. $sql12="SELECT * FROM `$tabelka` WHERE id = '$down' "; 
  89. $result12 = mysql_query ($sql12) 
  90.  or die ("bład zapytania select"); 
  91. $row12 = mysql_fetch_array ($result12);
  92. if(isset($_GET['down']) && $_GET['down'] == $row12['id']) {
  93. echo '
  94. <title>'.$row12['tytul'].' - '.$tytul_strony.'</title>
  95. <meta name="description" content="'.$row12['tytul'].' - '.$desc.'">
  96. <meta name="keywords" content="'.$row12['tytul'].' - '.$keywords.'">
  97. ';
  98. }
  99.  
  100. if($_GET['id'] == 'szukaj') {
  101. $wykonawca=$_POST['wykonawca'];
  102. echo '
  103. <title>'.$wykonawca.' - '.$tytul_strony.'</title>
  104. <meta name="description" content="'.$wykonawca.' - '.$desc.'">
  105. <meta name="keywords" content="'.$wykonawca.' - '.$keywords.'">
  106. ';
  107.  
  108. }
  109. elseif($_GET['id'] == '' && $_GET['id'] == '' && $_GET['down'] == '') { 
  110. echo '
  111. <title>'.$tytul_strony.'</title>
  112. <meta name="description" content="'.$desc.'">
  113. <meta name="keywords" content="'.$keywords.'">
  114. ';
  115. }
  116. echo '
  117. <meta http-equiv=Content-Type content="text/html; charset=UTF-8">
  118. <meta name="robots" content="index, follow">
  119. <meta name="language" content="pl">
  120. <meta name="revisit-after" content="1 day">
  121. <link href="screen.css" rel="stylesheet" type="text/css" media="screen" />
  122. <link rel="shortcut icon" href="favicon.ico">
  123.  
  124. </head>
  125. <body>';
  126. require_once('Pager.class.php');
  127.  
  128. }
  129. else {
  130.  
  131.  
  132. require_once('conf2.php');
  133. require_once('funkcje2.php');
  134. polaczenie();
  135.  
  136. $connection = @mysql_connect($db_dane['hostname'], $db_dane['user'], $db_dane['password']);
  137. // wyœwietlasz stronę
  138.  
  139. //require_once('Pager.class.php');
  140. $result = mysql_query("SELECT * FROM $tabelka ");
  141. $razem = mysql_num_rows($result); 
  142. $sql12="SELECT * FROM `$tabelka` WHERE id = '$down'"; 
  143. $result12 = mysql_query ($sql12) 
  144.  or die ("bład zapytania select"); 
  145. $row12 = mysql_fetch_array ($result12);
  146. if (isset($_GET['down']) && $_GET['down'] == $row12['id'] && $_GET['download'] == $row12['id'])
  147. {
  148.  
  149. $query = "SELECT * FROM mp3 WHERE id = '$download';"; // tutaj wybieramy "plik" z tabeli który został podany w nagłówku warunek.
  150. $wynik = mysql_query ($query); // wykonanie powyższej linii
  151.  $dane = mysql_fetch_array ($wynik);
  152.  $licznik = $dane[licznik];
  153.  $url = $dane[link];
  154. // Przypisanie rekordów do zmiennych.
  155. header("location: $url"); // Œcišga plik z podanego URL.
  156. $query = "UPDATE mp3 SET licznik = licznik+1 WHERE id='$download';"; // zlicza œcišgnięcia
  157. $wynik = mysql_query ($query); // wykonuje powyższa linijkę kodu
  158. return $licznik+1;
  159. }
  160. echo '
  161. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  162. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  163. <head>';
  164. $sql12="SELECT * FROM `$tabelka` WHERE id = '$id' "; 
  165. $result12 = mysql_query ($sql12) 
  166.  or die ("bład zapytania select"); 
  167. $row12 = mysql_fetch_array ($result12);
  168. if(isset($_GET['id']) && $_GET['id'] == $row12['id']) {
  169. echo '
  170. <title>'.$row12['tytul'].' - '.$tytul_strony.'</title>
  171. <meta name="description" content="'.$row12['tytul'].' - '.$desc.'">
  172. <meta name="keywords" content="'.$row12['tytul'].' - '.$keywords.'">
  173. ';
  174. }
  175. $sql12="SELECT * FROM `$tabelka` WHERE id = '$down' "; 
  176. $result12 = mysql_query ($sql12) 
  177.  or die ("bład zapytania select"); 
  178. $row12 = mysql_fetch_array ($result12);
  179. if(isset($_GET['down']) && $_GET['down'] == $row12['id']) {
  180. echo '
  181. <title>'.$row12['tytul'].' - '.$tytul_strony.'</title>
  182. <meta name="description" content="'.$row12['tytul'].' - '.$desc.'">
  183. <meta name="keywords" content="'.$row12['tytul'].' - '.$keywords.'">
  184. ';
  185. }
  186.  
  187. if($_GET['id'] == 'szukaj') {
  188. $wykonawca=$_POST['wykonawca'];
  189. echo '
  190. <title>'.$wykonawca.' - '.$tytul_strony.'</title>
  191. <meta name="description" content="'.$wykonawca.' - '.$desc.'">
  192. <meta name="keywords" content="'.$wykonawca.' - '.$keywords.'">
  193. ';
  194.  
  195. }
  196. elseif($_GET['id'] == '' && $_GET['id'] == '' && $_GET['down'] == '') { 
  197. echo '
  198. <title>'.$tytul_strony.'</title>
  199. <meta name="description" content="'.$desc.'">
  200. <meta name="keywords" content="'.$keywords.'">
  201. ';
  202. }
  203. echo '
  204. <meta http-equiv=Content-Type content="text/html; charset=UTF-8">
  205. <meta name="robots" content="index, follow">
  206. <meta name="language" content="pl">
  207. <meta name="revisit-after" content="1 day">
  208. <link href="screen.css" rel="stylesheet" type="text/css" media="screen" />
  209. <link rel="shortcut icon" href="favicon.ico">
  210.  
  211. </head>
  212. <body>';
  213. require_once('Pager.class.php);
  214. }
  215. ?>
Go to the top of the page
+Quote Post
nospor
post
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...
Go to the top of the page
+Quote Post
sniezny_wilk
post
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 ?:

  1. <?php
  2. $result = mysql_query("SELECT * FROM $tabelka ");
  3. ?>


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

Cytat(nospor @ 29.05.2008, 14:22:29 ) *
$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) !
Go to the top of the page
+Quote Post
guitarnet.pl
post
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)
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: 15.09.2025 - 05:19