Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQLi]Optymalizacja
Kubik93
post 12.01.2020, 17:38:50
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Cześć wszystkim ! smile.gif

Mam tabele wyników generowaną z bazy. Każdy użytkownika może przenieść daną pozycję do swojej tabeli (korzystam z AJAXA - bez przeładowania strony smile.gif)
Aktualnie jestem na etapie blokowania buttona tak aby podczas generowania wyników skrypt blokował buttony wierszy, które dany użytkownik ma w swojej tabeli.

Wiem, że mogę przy każdym generowaniu wiersza łączyć się z tabelą i sprawdzać czy dany wiersz znajduje się w bazie użytkownika aczkolwiek po np. 50 wierszach serwer będzie otrzymywać 50 zapytań na raz. przy 50 użytkownikach mamy 2500 zapytań....

Ktoś ma pomysły jak zoptymalizować dany problem?

Dzięki z góry!
Go to the top of the page
+Quote Post
Pyton_000
post 12.01.2020, 19:57:08
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nie bardzo rozumiem jaki masz problem. Pobierasz sobie wszystkie id wierszy które już ma user. Przy dodawaniu/usuwaniu dodajesz albo usuwasz id w tablicy JS tak żeby mieć "aktualne dane" Po stronie backenu trzeba tylko zadbać o duplikaty i tyle.

Co do ilości zapytań o ile indeksy będą na polach to nie ma problemu z ilością.
Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 19:06:32
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


A to spoko. Myślałem, że to mi będzie korkować serwer wink.gif

Tak wiem, że temat rozwiązany aczkolwiek chciałem jeszcze o coś podpytać ponieważ zauważyłem pewną sytuacje smile.gif

  1. $check_mytable = 'SELECT id FROM '.$my_id.'mytable WHERE id='.$row["id"].'';
  2. $result_conect_mytable = mysqli_query($db_mytable, $check_mytable);
  3. $how_many_mt_results = mysqli_num_rows($result_conect_mytable);
  4. if ($how_many_mt_results>0){
  5. $have_in_mt_a = 'style="display: none;"';
  6. $have_in_mt_c = 'style="display: block;"';
  7. }
  8. else{
  9. $have_in_mt_a = 'style="display: block;"';
  10. $have_in_mt_c = 'style="display: nonce;"';
  11. }


kod fajnie działa, jeśli użytkownik ma pozycje w swojej bazie to button od wysłania do bazy ustawiam na display: none i button zablokowany n display: block.
I jest taka sprawa, przy odświeżaniu strony jest ułamek sekundy display none i dopiero wtedy zmienia się na none.

Jakiś pomysł na rozwiązanie problemu?

Myślę aby nazwa byttona i jego klase ustawić na zmienną aczkolwiek nie wiem czy to optymalne rozwiązanie smile.gif

Dzięki za odpowiedzi.
Go to the top of the page
+Quote Post
nospor
post 13.01.2020, 19:19:18
Post #4





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




A jak ty odpalasz ten kod? To jest jakis AJAX dla kazdego rekordu z osobna?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 19:59:09
Post #5





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Mam tabele danych "ogólną" w sqlu.
Ajaxem przesyłam dane z tabeli ogólnej do tabeli użytkownika też w sqlu wink.gif
Go to the top of the page
+Quote Post
nospor
post 13.01.2020, 20:10:18
Post #6





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Czyli jesli dobrze zrozumialem:
powiedzmy, ze masz 50 rekordow, to ty naraz wysylasz 50 AJAXow tylko po to, by stwierdzic czy button ma byc disabled czy nie, tak? No to z lekka przekominowales i to na pewnoe nie jest optymalne, wrecz odwrotnie wink.gif

Jak budujesz te tabele z rekordami, to juz na tym etapie masz wiedziec czy BUTTON ma byc czy nie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 20:19:01
Post #7





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Dobra to postaram się opisać wszystko jak najbardziej się da smile.gif

Dajmy na to baza w której mamy 100 wierszy.
Wyświetlamy każdy wiersz pętlą for i w każdym wierszu wyświetlamy też Button "dodaj do listy". Button uruchamia JS i dane są wysyłane do bazy.

http://www.creobajt.pl/artykuly/ajax-z-jqu...ych-z-bazy.html

Na podstawie tego poradnika.

Teraz, każde wyświetlenie rekordu w pętli for łączy się z tabelą użytkownika i sprawdza na podstawie id czy ten wiersz jest już w bazie użytkownika.
Jeśli tak to button :none + Div :block.
Jesśli nie to button :block + Div :none

biggrin.gif
Go to the top of the page
+Quote Post
nospor
post 13.01.2020, 20:24:04
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Dalej nie kumam.
Kod, ktory podales w poscie nr 3 to jak jest odpalany? Przez AJAX czy nie? Bo piszesz, ze ten kod z opoznieniem chowa/pokazuje ci button, a tak moze sie tylko dziac, gdy odpalasz go przez AJAX. wiec jesli ten ajax jest w petli, to lipnie masz to zrobione.

Jesli zas ten kod odpalany jest normalnie, podczas generowanie wlasciwej strony, to nie rozumiem skad te opoznienie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 20:29:46
Post #9





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


3 post to kod z generowanej strony który odpala się w pętli przy generowaniu wierszy z głównej tablicy smile.gif
Sam Ajax jest uruchamiany onClickem Buttona.

W sumie bez sensu wspomniałem o tym Ajaxie bo tak naprawdę on tutaj nie ma nic do rzeczy smile.gif

Ten post edytował Kubik93 13.01.2020, 20:31:37
Go to the top of the page
+Quote Post
nospor
post 13.01.2020, 20:32:01
Post #10





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




To nie ogarniam skad ci sie to opoznienie niby bierze. Skoro to na biezaco przygotowuje dane dla kodu html, wiec powinno byc bez zadnego opoznienia. Cos mieszasz panie kolego. Moze lepiej pokaz caly kod bo tak w zyciu nie dojdziemy.

No i fakt, ze generujesz na raz przy 100 rekordach 100 zapytan, to jest dalece od optymalnego podejscia. Chyba ze zrozumiales, co napisal pyton


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 20:39:05
Post #11





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


  1. for ($i = 1; $i <= $how_many_results; $i++)
  2. {
  3. $row = mysqli_fetch_assoc($result_conect);
  4.  
  5. if ($row['person']=='')
  6. {$row['person']='Brak';}
  7. if ($row['phone']=='')
  8. {$row['phone']='Brak';}
  9. if ($row['email']=='')
  10. {$row['email']='Brak';}
  11.  
  12. /*SPRAWDZ CZY JEST W TABLICY MT*/
  13. $check_mytable = 'SELECT id FROM '.$my_id.'mytable WHERE id='.$row["id"].'';
  14. $result_conect_mytable = mysqli_query($db_mytable, $check_mytable);
  15. $how_many_mt_results = mysqli_num_rows($result_conect_mytable);
  16. if ($how_many_mt_results>0){
  17. $have_in_mt_a = 'style="display: none;"';
  18. $have_in_mt_c = 'style="display: block;"';
  19. }
  20. else{
  21. $have_in_mt_a = 'style="display: block;"';
  22. $have_in_mt_c = 'style="display: nonce;"';
  23. }
  24. echo<<<END
  25. <form>
  26. <div class="date-list-div-global">
  27. <div class="date-list-div-top">{$row['cname']}<span class="date-list-span">costam</span></div><hr class="date-list-div-top-hr">
  28. <div class="date-list-div-main">{$row['country']} {$row['postcode']} {$row['city']}, {$row['adress']}<span class="date-list-span">od {$row['fromday']} do {$row['today']} od {$row['fromhour']} do {$row['tohour']}</span><br /><br />
  29. <b>Preferowany transport:</b>&nbsp;{$row['sattel']}<br /><br />
  30. <b>Dane kontaktowe</b><br />
  31. <img src="../icons/user.png"/>&nbsp;{$row['person']}<br />
  32. <img src="../icons/phone.png"/> {$row['phone']}&nbsp;&nbsp;&nbsp;<img src="../icons/email.png"/>&nbsp;&nbsp;{$row['email']}<span class="date-list-span">{$row['webadress']}</span></div>
  33. <hr class="date-list-div-top-hr">
  34. <input type="hidden" value="{$row['id']}" name="id"/>
  35. <input type="hidden" value="{$row['country']}" name="country"/>
  36. <input type="hidden" value="{$row['cname']}" name="cname"/>
  37. <input type="hidden" value="{$row['CID']}" name="CID"/>
  38. <input type="hidden" value="{$row['postcode']}" name="postcode"/>
  39. <input type="hidden" value="{$row['city']}" name="city"/>
  40. <input type="hidden" value="{$row['sattel']}" name="sattel"/>
  41. <input type="hidden" value="{$row['fromhour']}" name="fromhour"/>
  42. <input type="hidden" value="{$row['tohour']}" name="tohour"/>
  43. <input type="hidden" value="{$row['fromday']}" name="fromday"/>
  44. <input type="hidden" value="{$row['today']}" name="today"/>
  45. <input type="hidden" value="{$row['person']}" name="person"/>
  46. <input type="hidden" value="{$row['email']}" name="email"/>
  47. <input type="hidden" value="{$row['phone']}" name="phone"/>
  48. <input type="hidden" value="{$row['webadress']}" name="webadress"/>
  49. <button type="button" name="addcontact" class="date-list-div-bottom-a" name="add-contact" $have_in_mt_a>Dodaj kontakt</button>
  50. <label class="date-list-div-bottom-c" name="contact-added" $have_in_mt_c>Kontakt dodany</label>
  51. </div>
  52. </form>
  53. END;
  54. }


To jest pętla dla jednego wiersza
Go to the top of the page
+Quote Post
nospor
post 13.01.2020, 20:44:09
Post #12





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Czyli styl dla button nadajesz od razu, wiec nadal nie rozumiem o jakim opoznieniu mowisz w (nie)wyswietlaniu buttona. To nie ma sensu.

Zas tak jak mowilem, w petli generujesz zapytania a to juz na pewno dobre nie jest


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 20:50:12
Post #13





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Opóźnienie naprawione, jakaś alternatywa dla rozwiązania z optymalizacją?
Go to the top of the page
+Quote Post
nospor
post 13.01.2020, 20:52:55
Post #14





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




To napisz jak naprawiles bo niezmiernie mnie to ciekawi

Co do optymalizacji to zamiast zapytan w petli masz zapytanie przed petla tak napisac, by pobieralo wszystkie niezbedne dane od razu


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 13.01.2020, 20:56:23
Post #15





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Hah a późnienie było spowodowane, że w ccsie miałem ustawione wartości Display dla buttony i najpierw łapał display status z ccsa a później ze zmiennej smile.gif
Go to the top of the page
+Quote Post
trueblue
post 13.01.2020, 21:39:57
Post #16





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Ciekawe jak to możliwe, skoro wstawiasz je jako style inline i mają większy priorytet.


--------------------
Go to the top of the page
+Quote Post
Kubik93
post 14.01.2020, 18:45:02
Post #17





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Ps.
  1. $have_in_mt_c = 'style="display: nonce;"';


tutaj jeszcze była literówka. Innych błędów nie znalazłem podczas naprawy opóźnienia smile.gif

Jeśli chodzi o optymalizację to przed pętlą wyciągnąłem id z tablicy assocjacyjnej i wpychałem dane do nowej tablicy:

  1. $check_mytable = 'SELECT id FROM '.$my_id.'mytable';
  2. $result_conect_mytable = mysqli_query($db_mytable, $check_mytable);
  3. $how_many_mt_results = mysqli_num_rows($result_conect_mytable);
  4.  
  5.  
  6. $array_my_table_id = [];
  7.  
  8. for($i=1;$i<=$how_many_mt_results;$i++){
  9. $mytable_row = mysqli_fetch_assoc($result_conect_mytable);
  10. echo $mytable_row['id'];
  11. array_push($array_my_table_id, $mytable_row['id']);
  12. }


a później w pętli sprawdzałem pętlą for czy też id z głównej tablicy == id z nowej tablicy. Jeśli tak to przypisz display: block/none i break tak by nie sprawdzac kolejnych Id.

  1. for($k = 0; $k <=$how_many_mt_results; $k++){
  2. if($row['id']==$array_my_table_id[$k]){
  3. $have_in_mt_a = 'style="display: none;"';
  4. $have_in_mt_c = 'style="display: block;"';
  5. break;
  6. }else{
  7. $have_in_mt_a = 'style="display: block;"';
  8. $have_in_mt_c = 'style="display: none;"';
  9. }


Czy teraz będzie wydajnie biggrin.gif ?


Go to the top of the page
+Quote Post
nospor
post 15.01.2020, 10:34:13
Post #18





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




jesli w my_table bedziesz mial milion rekordow to nadal zle wink.gif

Nie mozessz poprostu go glownego zapytania przed petla dodac LEFT JOIN do my_table? I juz


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kubik93
post 16.01.2020, 17:39:31
Post #19





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 20.12.2019

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


Okay..

  1. $check_id_mytable = 'SELECT*FROM clients.sender t1 LEFT JOIN mytable.'.$my_id.'mytable t2 on t2.id = t1.id';


Zapytanie dla tabel z różnych baz.
Jak nawiązać połączenie do dwóch różnych baz ? gdybym wszystko trzymał w jednej to by nie było problemu ale chyba lubie sobie robić pod górkę smile.gif
... a przy okazji więcej się ucze smile.gif
Go to the top of the page
+Quote Post
trueblue
post 16.01.2020, 18:02:06
Post #20





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Chyba tak.
https://stackoverflow.com/a/28302993


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 28.03.2024 - 11:08