Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Geometryczny wzrost transferu w stosunku do wielkości bazy
Forum PHP.pl > Forum > Przedszkole
majestiq
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 ?
nospor
Pobierasz liczbę rekordow poprzez pobranie ich wszystkich i zliczenie ile ich jest. powinienes uzyc count() 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
majestiq
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ć questionmark.gif
To jest jakaś masakra z tym transferem, jakby każde zapytanie do bazy pobierało za każdym razem całą baze ...
nospor
W tym kodzie nie widze nie niepokojącego, nie licząc tych cudnych nazw zmiennych winksmiley.jpg
scanner
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?
guitarnet.pl
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
majestiq
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. ?>
nospor
$result = mysql_query("SELECT * FROM $tabelka ");
$razem = mysql_num_rows($result);

Przeciez tu pobierasz wszystkie dane. A mowiles ze uzywasz COUNT...
sniezny_wilk
a co to i po co ?:

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


EDIT: @nospor, byłeś szybszy smile.gif
majestiq
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 exclamation.gif!
guitarnet.pl
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 smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.