Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO][MySQL] Optymalizacja zapytania
Forum PHP.pl > Forum > Przedszkole
mlawnik
Witam, mam skrypt, który przetwarza tabelę i zapisuje ją do bazy danych.
Oto kod:

https://github.com/marcinlawnik/DziennikLog...rToDatabase.php

Przetwarzanie odbywa się w pętli, chciałbym je zoptymalizować. Przyszły mi do głowy transakcje.

1. Nie mam pojęcia gdzie wstawić $pdo->beginTransaction(); Jak wstawię w środku pętli, to będę ich tworzył bardzo dużo, a przed pętlą select nie wykona się poprawnie. Prosiłbym o nakierowanie.

Wystarczy wstawić na początku skryptu. Sam sobie odpowiedziałem.

Drugie pytanie nadal pozostaje w mocy.

2. Czy są jeszcze inne sposoby na zoptymalizowanie tego zapytania?

Pozdrawiam,
mlawnik
mstraczkowski
Nie zaleca się tworzenia jednej dużej transakcji, aby podczas jej trwania tworzyło i zmieniało się milion różnych rzeczy
Takie podejście jest bardzo błędne, a skoro powiedziałeś, że umieściłeś BEGIN na początku skryptu to zapewne taka WIELKA transakcja ma u ciebie miejsce

Transakcja to coś pojedynczego i szybkiego.

Wyobraź sobie transakcję finansową (pobieramy pieniądze z jednego konta i przekazujemy je do konta drugiego)
Te dwa zapytania tworzą jedną transakcję - zarówno dosłownie jak i pod względem programistycznym

Poza tym obawiam się, że transakcja z optymalizacją ma mało wspólnego
mlawnik
A to?

http://forum.php.pl/index.php?s=&showt...t&p=1050967

Czy mógłby się ktoś do tego odnieść?
Crozin
1. Zapytania możesz przygotować ($pdo->prepare) raz, przed pętlą, i używać ich później wielokrotnie w pętli.
2. Powinieneś najpierw spróbować pobrać za jednym zamachem wszystkie ID przedmiotów na podstawie ich nazw. Dopiero w następnym kroku utworzyć nowe rekordy w bazie dla nieistniejących jeszcze przedmiotów.
3. Wydaje mi się, że wielokrotnie wyszukujesz niemal tych samych danych w HTML-u.
Cytat
Poza tym obawiam się, że transakcja z optymalizacją ma mało wspólnego
Jednym ze skutków ubocznych wykorzystania transakcji jest przebudowanie indeksów dopiero po jej zakończeniu, a nie po każdym zapytaniu - to potrafi dać ogromnego kopa przy dużej liczbie zapytań INSERT.
mlawnik
@crozin
Dzięki za opinię, 1 i 2 wprowadzę w życie.

Natomiast co miałeś na myśli w podpunkcie trzecim?

Crozin
Cytat
Natomiast co miałeś na myśli w podpunkcie trzecim?
Za każdym razem gdy pobierasz coś z HTML-a, czy raczej już drzewa DOM wykonujesz dosyć kosztowne wyszukiwanie po całym dokumencie. Przykładowo w linii #74 wykonujesz wewnątrz podwójnej pętli coś takiego:
  1. while (...) {
  2. while (...) {
  3. $gradeCell = $html->find('table', 4)->find('tr', $i)->find('td', $x)->plaintext;
  4. }
  5. }
Każdorazowo wykonując względnie rozbudowane wyszukiwanie w dużym dokumencie. A można przecież zrobić coś w stylu:
  1. $table = $html->find('table', 4);
  2.  
  3. foreach ($table->children() as $row) {
  4. foreach ($row->children() as $cell) {
  5. $grade = $cell->plaintext;
  6. }
  7. }
Nagle zamiast $i * $x wyszukiwań w rozbudowanym dokumencie masz jedno.
mlawnik
Dzięki za wytłumaczenie, postaram się przepisać tą funkcje tak jak mówisz, zrobię benchmarka i dam do oceny jeszcze raz.
Czy ktoś ma inne sugestie?

Pozdrawiam,
mlawnik

PS Przymuliłem ostro komputer:

  1. var_dump($table->children());


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.