Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PDO][MySQL] Optymalizacja zapytania, Lub inne usprawnienie działania
mlawnik
post
Post #1





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


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

Ten post edytował mlawnik 22.06.2013, 18:55:57


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
mstraczkowski
post
Post #2





Grupa: Zarejestrowani
Postów: 273
Pomógł: 52
Dołączył: 3.02.2013
Skąd: Przemyśl

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


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

Ten post edytował mstraczkowski 23.06.2013, 02:46:43


--------------------
Jeżeli moja wypowiedź Ci pomogła użyj przycisku
Go to the top of the page
+Quote Post
mlawnik
post
Post #3





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


A to?

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

Czy mógłby się ktoś do tego odnieść?


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
mlawnik
post
Post #5





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


@crozin
Dzięki za opinię, 1 i 2 wprowadzę w życie.

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



--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
mlawnik
post
Post #7





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

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


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());




Ten post edytował mlawnik 23.07.2013, 11:42:33


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 08:32