Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][MySQL][PHP] Optymalizacja i sprawdzenie skryptu
Forum PHP.pl > Forum > Przedszkole
nikos
Witam!
Mam skrypt, który aktualizuje dane z jednej bazy MySQL z drugą.

Po zrobieniu testu na zamianie 6 rekordów w jednej bazie są one zmieniane w drugiej. Ale:

Ogólna ilość dostępnych i niedostępnych produktów zmienia się o 8 zamiast o 6?

Ogólnie pobieram rekordy gdzie stan jest <3 i w drugiej bazie wyłączam je avaiblable = 0
A potem sprawdzam rekordy które są >2 i włączam za pomocą avaiblable = 1


  1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. ini_set( 'display_errors', 'On' );
  4. error_reporting( E_ALL );
  5. // serwer 1
  6. $servername1 = "localhost";
  7. $username1 = "root";
  8. $password1 = "";
  9. $dbname1 = "sklep";
  10. //serwer 2
  11. $servername2 = "localhost";
  12. $username2 = "root";
  13. $password2 = "";
  14. $dbname2 = "test";
  15.  
  16. $connect1 = mysqli_connect($servername1, $username1, $password1, $dbname1);
  17. $connect2 = mysqli_connect($servername2, $username2, $password2, $dbname2);
  18.  
  19.  
  20. $query1 = "SELECT * FROM `sklep_towary` WHERE STAN < 3";
  21. $query2 = "SELECT * FROM `sklep_towary` WHERE STAN > 2";
  22.  
  23.  
  24. $result1 = mysqli_query($connect1, $query1);
  25. $result2 = mysqli_query($connect1, $query2);
  26.  
  27. if(mysqli_num_rows($result1) > 0){
  28. while($row = mysqli_fetch_assoc($result1))
  29. { $indeks = $row['INDEKS'];
  30. $stan = $row['STAN'];
  31. $zapytanie = "UPDATE dimensions_available_phones SET avaiblable = 0 WHERE subiekt_id ='$indeks' " or die(mysql_error());
  32. $wynik = mysqli_query($connect2, $zapytanie);
  33.  
  34. }
  35. if($wynik){
  36. echo'Wyłączono';
  37. }
  38. }
  39. if(mysqli_num_rows($result2)>0){
  40. while($row = mysqli_fetch_assoc($result2)){
  41. $indeks = $row['INDEKS'];
  42. $stan = $row['STAN'];
  43. $zapytanie2 = "UPDATE dimensions_available_phones SET avaiblable = 1 WHERE subiekt_id ='$indeks' " or die(mysql_error());
  44. $wynik2 = mysqli_query($connect2, $zapytanie2);
  45. }
  46.  
  47. }
  48.  
  49. if($wynik2){
  50. echo 'Włączono';
  51. }
  52.  
  53.  
  54.  
  55. ?>


Dodam, że skrypt trochę długo się wykonuje i proszę o wskazówki jak można by było go zmodyfikować.
Oto test:
  1. UPDATE sklep_towary SET STAN = 5 WHERE INDEKS IN (12047,
  2. 08824,
  3. 08578,
  4. 13604,
  5. 15846,
  6. 17870)


i to daje
  1. SELECT * FROM `dimensions_available_phones` WHERE avaiblable = 0 1203
  2. SELECT * FROM `dimensions_available_phones` WHERE avaiblable = 1 1486

i dalej jak uruchomię na pierwszej bazie
  1. [SQL]
  2. UPDATE sklep_towary SET STAN = 0 WHERE INDEKS IN (12047,
  3. 08824,
  4. 08578,
  5. 13604,
  6. 15846,
  7. 17870)

[/SQL]

Dostaje
  1. SELECT * FROM `dimensions_available_phones` WHERE avaiblable = 0 1211
  2. SELECT * FROM `dimensions_available_phones` WHERE avaiblable = 1 1478

Pozdrawiam
nospor
No a nie jest tak, ze w tabeli drugiej masz kilka rekordow dla ktorych subiekt_id wskazuje na ten sam index?
nikos
Cytat(nospor @ 19.07.2017, 14:09:55 ) *
No a nie jest tak, ze w tabeli drugiej masz kilka rekordow dla ktorych subiekt_id wskazuje na ten sam index?

Właśnie tak jest! Tego bym się nie spodziewał!
Dzięki

Czy na pierwszy rzut oka widziałbyś jakąś modyfikację aby poprawić szybkość obciążenie bazy?
nospor
Wykonujesz raptem 6 razy prosty UPDATE. Skoro przy czyms takim ci muli, to pewnie nie masz zalozonych indeksow na polach, po ktorych wyszukujesz zarowno przy select jak i update
nikos
Cytat(nospor @ 19.07.2017, 14:48:01 ) *
Wykonujesz raptem 6 razy prosty UPDATE. Skoro przy czyms takim ci muli, to pewnie nie masz zalozonych indeksow na polach, po ktorych wyszukujesz zarowno przy select jak i update


Nie ma założonych indeksów na polach STAN i subiekt_id dodam je dzięki!
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.