Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja skryptu PHP
zbysiusp
post
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

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


Witam!

Na potrzeby wykresu Highcharts napisałem skrypt PHP, który pobiera dane z bazy MySQL i koduje je do formatu JSON (3 serie danych). Skrypt działa poprawnie, ale czas jego wykonania i pobrania wyniku do przeglądarki jest bardzo długi ok. 10 sekund co stwarza problemy przy wywoływaniu go co 1 minutę wraz z innymi skryptami - zawieszenie przeglądarki po ok. 1 godzinie. W przykładzie poniżej ograniczyłem wynik do 5 minut, ale w rzeczywistości pobierane są dane z miesiąca (43 tys. rekordów). Proszę o radę w jaki sposób zoptymalizować ten skrypt?

Oczekiwany format kodowania:
Wynik działania skrypu

Kod:
  1. $sth = mysql_query("SELECT czas_unix, wind_speed_average, windgust, wind_direction_average FROM tab_czujniki_2 WHERE czas_datetime >= '$minus_data' ORDER BY czas_datetime ASC") or die('Błąd zapytania');
  2.  
  3. $rows = array();
  4. $rows['name'] = 'wind_speed_average';
  5. $rows1 = array();
  6. $rows1['name'] = 'windgust';
  7. $rows2 = array();
  8. $rows2['name'] = 'wind_direction_average';
  9.  
  10. while($r = mysql_fetch_array($sth)){
  11. $rows['data'][] = array(1000*($r['czas_unix']),$r['wind_speed_average']);
  12. $rows1['data'][] = array(1000*($r['czas_unix']), $r['windgust']);
  13. $rows2['data'][] = array(1000*($r['czas_unix']), $r['wind_direction_average']);
  14. }
  15.  
  16. $result = array();
  17. array_push($result,$rows);
  18. array_push($result,$rows1);
  19. array_push($result,$rows2);
  20. print json_encode($result, JSON_NUMERIC_CHECK)


Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zbysiusp
post
Post #2





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

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


Cytat(phpion @ 14.03.2017, 07:11:02 ) *
1. Explain select czas_unix... i wklej tutaj wynik.
2. Co do tych pseudo benchmarków to zatrzymuj skrypt w określonych miejscach, np. po linii z mysql_query i zobacz, który fragment kodu zabiera najwiecej czasu.


Czas wykonania zapytania w odniesieniu do pobrania wszystkich rekordów z bazy danych jest zależny od obciążenia serwera, ale nie dłuższy niż 2 sekundy (EXPLAIN).

czas zapytania 1
czas zapytania 2

Nie wiem co począć z EXPLAIN:
EXPLAIN
Analizator EXPLAIN

Zwolnienie może być na etapie selekcji rekordów do wyświetlenia. Sekcja kodu przygotowująca przedział czasowy do pobrania rekordów może być nieoptymalnie napisana (kod poniżej) Nie mam pomysłu jak to napisać wydajniej:
  1. $wynik_data = mysql_query("SELECT czas_datetime FROM tab_czujniki_2 ORDER BY czas_datetime DESC LIMIT 1");
  2.  
  3. if(mysql_num_rows($wynik_data) > 0) {
  4. $r = mysql_fetch_assoc($wynik_data);
  5. $datan = $r['czas_datetime'];
  6. $daten = new DateTime($data);
  7. $daten->modify('-49 day');
  8. $minus_data = $daten->format("Y-m-d H:i:00");
  9. }
  10.  
  11.  
  12. $sth = mysql_query("SELECT czas_unix, wind_speed_average, windgust, wind_direction_average FROM tab_czujniki_2 WHERE czas_datetime >= '$minus_data' ORDER BY czas_datetime ASC") or die('Błąd zapytania');


Dziękuję za pochylenie się nad tematem i pomoc.
Pozdrawiam
Go to the top of the page
+Quote Post

Posty w temacie
- zbysiusp   Optymalizacja skryptu PHP   13.03.2017, 14:20:19
- - daro0   Masz założony indeks na pole czas_datetime?   13.03.2017, 17:20:56
- - zbysiusp   Cytat(daro0 @ 13.03.2017, 17:20:56 ) ...   13.03.2017, 17:23:58
- - qbson69   Problemem chyba nie jest zapytanie, ale duża ilość...   13.03.2017, 17:41:22
- - zbysiusp   Cytat(qbson69 @ 13.03.2017, 17:41:22 ...   13.03.2017, 17:55:09
- - viking   Sprawdź w jakimś narzędziu typu heidisql ile samo ...   13.03.2017, 18:54:49
- - zbysiusp   Cytat(viking @ 13.03.2017, 18:54:49 )...   13.03.2017, 19:56:57
- - phpion   Też obstawiałbym, że problemem jest ilość zwracany...   13.03.2017, 22:57:46
- - zbysiusp   Cytat(phpion @ 13.03.2017, 22:57:46 )...   13.03.2017, 23:21:09
- - phpion   1. Explain select czas_unix... i wklej tutaj wynik...   14.03.2017, 07:11:02
- - zbysiusp   Cytat(phpion @ 14.03.2017, 07:11:02 )...   14.03.2017, 07:51:16
- - daro0   Jaki to jest problem napisać sobie prostą klasę pr...   14.03.2017, 07:57:23
- - phpion   Tutaj widać, że zapytanie nie korzysta z żadnego i...   14.03.2017, 08:28:25
- - Pyton_000   Bo z czego miałby brać indeks skoro nie ma warunku...   14.03.2017, 08:53:35
- - zbysiusp   Cytat(phpion @ 14.03.2017, 08:28:25 )...   14.03.2017, 09:32:48
- - Lion   Jeśli masz już indeks na kolumnie z czasem, a zapy...   14.03.2017, 09:37:00
- - zbysiusp   Założyłem indeks na kolumnie 'czas_datetime...   14.03.2017, 19:57:25
- - daro0   A zdajesz sobie sprawę z tego co w takim przypadku...   15.03.2017, 11:40:52
- - zbysiusp   Witam. Bardzo dziękuję Wszystkim za rady, sugesti...   17.03.2017, 15:44:19
- - viking   Robisz tutaj 3 klucze stałe więc możesz od razu do...   17.03.2017, 16:31:37
- - zbysiusp   @viking Dziękuję bardzo. Działa dobrze. Pozdrawia...   17.03.2017, 18:04:34


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: 2.10.2025 - 17:42