Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Bardzo wolne zapytanie
Forum PHP.pl > Forum > PHP
toolmaniak
Witam.

Właśnie jestem na etapie udoskonalania moich statystyk whois, i zacząłem od przeróbki interfejsu wykresów różnych danych o odwiedzających. Użyłem do tego celu opensourceowej klasy "open flash chart" która tworzy zbiór danych wyjściowych i przesyła do archiwum SWF które zajmuje się przedstawieniem tego w formie wykresu macromedia flash.


Jest do dokładne odwzorowanie tego co posiada google analitycs. Ale teraz to sedna. Problem w tym, że w kodzie generującym zestawnienie wizyt i odsłon w ciagu ostatniego tygodnia , zapytania do mysql trwają bardzo długo. Korzystam z trzech osobnych query: jedno odlicza ostatnich siedem dni od bieżącej daty i pobiera nazwy dni, drugie i trzecie zwraca odpowiednio wszystkich odwiedzających z jednego IP, którzy przeglądali w danym okresie albo jedną lokalizacje lub więcej. Kod wygląda mniej więcej tak:

  1. <?php 
  2.  
  3. session_name('STATS_SESS');
  4.  
  5. include ("db.php");
  6. include_once( 'ofc-library/open-flash-chart.php' );
  7.  
  8. $data  = array();
  9. $datay1 = array();
  10. $datay2 = array();
  11.  
  12.  
  13.  
  14.  
  15. for ($i=7; $i>0; $i--) {
  16.  
  17. $parent_date = date("d.m.Y",strtotime("-".$i." days",time())); 
  18.  
  19.  
  20. $d_elem = explode('.',$parent_date);
  21. /*
  22. foreach($d_elem as $t_value)
  23. {
  24. echo $t_value;
  25. }
  26. */
  27. $d_strontment = $d_elem[2]."-".$d_elem[1]."-".$d_elem[0];
  28.  
  29.  
  30. $leg_tab = mysql_query("select case date_format(VISIT_DATA,'%w') 
  31.  
  32.  when 1 then 'pon.'
  33.  when 2 then 'wt.'
  34.  when 3 then 'sr.'
  35.  when 4 then 'czw.'
  36.  when 5 then 'pt.'
  37.  when 6 then 'so.'
  38.  when 0 then 'nd.'
  39.  
  40.  end as dzien from EXTENSION where VISIT_DATA = '".$d_strontment."' order by VISIT_DATA DESC");
  41.  
  42. $leg_val = mysql_fetch_array($leg_tab);
  43. //print $leg_val[0]."<br>";
  44.  
  45. array_push($data,$leg_val[0]);
  46.  
  47.  
  48. $invites = mysql_query("select count(VISIT_ID) from URLS,EXTENSION where (URLS.VISIT_ID=EXTENSION.ID) and (EXTENSION.VISIT_DATA='".$d_strontment."') group by URLS.VISIT_ID having count(*) = 1;");
  49.  
  50. $inv_val = mysql_num_rows($invites);
  51.  
  52.  array_push($datay1,$inv_val);
  53.  
  54. $visites = mysql_query("select count(VISIT_ID) from URLS,EXTENSION where (URLS.VISIT_ID=EXTENSION.ID) and (EXTENSION.VISIT_DATA='".$d_strontment."') group by URLS.VISIT_ID having count(*) > 1;");
  55.  
  56. $vis_val = mysql_num_rows($visites);
  57.  
  58.  array_push($datay2,$vis_val);
  59.  
  60.  
  61. }
  62.  
  63.  
  64.  
  65. $g = new graph();
  66. $g->title( 'Zestawienie wizyty/odslony', '{font-size: 10px; color: #000000}' );
  67. // we add 3 sets of data:
  68. $g->set_data( $datay1 );
  69. $g->set_data( $datay2 );
  70. $g->line_dot( 3, 5, '#8BB1A1', 'Wizyty', 10);
  71. $g->line_hollow( 2, 4, '#BAA8BD', 'Odslony', 10 );
  72. $g->set_x_labels( $data );
  73. $g->set_y_max( 20 );
  74. //
  75. //
  76. //
  77. $g->set_inner_background( '#E3F0FD', '#CBD7E6', 90 );
  78. //
  79. //
  80. //
  81. $g->x_axis_colour( '#8499A4', '#E4F5FC' );
  82. $g->y_axis_colour( '#8499A4', '#E4F5FC' );
  83. $g->bg_colour = '#E4F5FC';
  84. $g->y_label_steps( 4 );
  85. $g->set_y_legend( 'Liczba odwiedzajacych', 12, '0x736AFF' );
  86. echo $g->render();
  87. ?>


Z góry dzięki :roll2:
pbnan
Jeżeli rzeczywiście tak dużo czasu zajmują zapytania SELECT, to może ustaw sobie jedno z porównywanych pól jako INDEX?
toolmaniak
Właśnie próbuje, nawet tzw. "indeksy pokrywające" zaprzęgne chyba do roboty. Thx
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.