Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Optymalizacja php mysql.
Forum PHP.pl > Forum > Przedszkole
szakalq
Witam,

Mam taki kod jak poniżej. Pobieram wszystkie numery telefonów z tabeli tb_telefony i do nich muszę dopisać poszczególne dane z tabeli tb_dane następnie eksportuje tablicę $arr_response_qsa do Excela.

W tabeli tb_telefony jest około 13000 wierszy danych po wykonaniu pierwszego zapytania, w drugim zapytaniu na każde tele_id jest około 10 wierszy z dane_id, wykonując ten skrypt serwer się wywala "Internal Server Error : Wewnętrzny błąd serwera" - bez dodawania części kodu PHP dotyczącej eksportu do Excela (korzystam z Spreadsheet_Excel_Writer).

$oDb to jest klasa do obsługi bazy danych mysql.

Jak daję LIMIT w pierwszym zapytaniu to działa, ale potrzebuję mieć wszystko w jednym pliku Excela.

Jak to zoptymalizować? Jak się nie da to chyba tylko dzielnie z LIMIT w pierwszym zapytaniu i wywoływanie kilka razy skryptu z różnym LIMIT?

  1. $tab = $oDb->query("SELECT tele_id, cpteGar, nazwa_kon, VIN, juz_wylosowany FROM tb_telefony WHERE tele_id > 0 AND miesiac= '" . $oMain->mVar['fala'] . "' ");
  2. $n = $oDb->numRows();
  3. for ($i = 0; $i < $n; $i++) {
  4. $row = $oDb->row();
  5. $arr_response_qsa_dane_telefony[$row['tele_id']] = $row;
  6. }
  7.  
  8.  
  9. foreach ($arr_response_qsa_dane_telefony as $key => $value) {
  10. $tab = $oDb->query("SELECT tele_id, dane_id, klas1, klas99, klas2, klas3, Q16 FROM tb_dane WHERE tele_id='" . $key . "' AND miesiac= '" . $oMain->mVar['fala'] . "' ");
  11. $n = $oDb->numRows(); // zwraca liczbe wierszy
  12. for ($i = 0; $i < $n; $i++) {
  13. $row = $oDb->row(); // wiersz
  14. $arr_response_qsa[$row['tele_id']]['numer_salonu'] = $arr_response_qsa_dane_telefony[$key]['cpteGar'];
  15. $arr_response_qsa[$row['tele_id']]['nazwa_kon'] = $arr_response_qsa_dane_telefony[$key]['nazwa_kon'];
  16. $arr_response_qsa[$row['tele_id']]['VIN'] = $arr_response_qsa_dane_telefony[$key]['VIN'];
  17. $arr_response_qsa[$row['tele_id']]['juz_wylosowany'] = $arr_response_qsa_dane_telefony[$key]['juz_wylosowany'];
  18. // co sie dzialo z danym tele_id
  19. $arr_response_qsa[$row['tele_id']][$row['dane_id']]['klas1'] = $row['klas1'];
  20. $arr_response_qsa[$row['tele_id']][$row['dane_id']]['klas99'] = $row['klas99'];
  21. $arr_response_qsa[$row['tele_id']][$row['dane_id']]['klas2'] = $row['klas2'];
  22. $arr_response_qsa[$row['tele_id']][$row['dane_id']]['klas3'] = $row['klas3'];
  23. $arr_response_qsa[$row['tele_id']][$row['dane_id']]['Q16'] = $row['Q16'];
  24. }
  25. }
Michasko
Nie jestem ekspertem, ale jeśli masz tak dużo rekordów, to być może brakuje pamięci dla skryptu ? Choć domyślnie jest 128MB, więc powinno styknąć.
Przejrzyj swój php.ini w poszukiwaniu linii
Kod
memory_limit = 128M

i kombinuj smile.gif
ber32
Witam.
napisz co zostaje wyświetlone z tego zapytania dodając echo
  1. $tab = $oDb->query("SELECT tele_id, cpteGar, nazwa_kon, VIN, juz_wylosowany FROM tb_telefony WHERE tele_id > 0 AND miesiac= '" . $oMain->mVar['fala'] . "' ");
  2. $n = $oDb->numRows();
  3. for ($i = 0; $i < $n; $i++) {
  4. $row = $oDb->row();
  5.  
  6. echo $arr_response_qsa_dane_telefony[$row['tele_id']] = $row;
  7. }
  8.  
szakalq
to co jest w tablicy:

  1. [6326] => Array
  2. (
  3. [0] => 6326
  4. [tele_id] => 6326
  5. [1] => 17001
  6. [cpteGar] => 17001
  7. [2] => koncecja
  8. [nazwa_kon] => koncecja
  9. [3] => UU1HS47366403
  10. [VIN] => UU18T547366403
  11. [4] => 999
  12. [juz_wylosowany] => 999
  13. )


itd. około 4000 elementów w tablicy
nospor
Zacznij od tego, by nie duplikować informacji w tablicy, tak jak to teraz robisz. Albo pobieraj indeksy numeryczne, albo tekstowe, a nie to i to, przez co danych masz dwa razy wiecej.
szakalq
Poprawiłem, korzystam tylko z tekstowych, ale dalej serwer się wysypuje, można coś jeszcze zoptymalizować w tym skrypcie ? Jak nie da się będę pobierał dane sekcjami i zapisywał do kilku plików exela.
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.