Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> optymalizacja pewnych zapytan
AcidBurnt
post
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 1
Dołączył: 13.04.2003
Skąd: z ławki przed blokiem

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


witam

nie za bardzo wiedzialem gdzie to wrzucic czy do php czy do baz, ostatecznie padło na bazy


mam taki kodzik w php
  1. <?php
  2.  
  3. $db -> Execute("UPDATE temida_users SET user_child = NULL");
  4. $row = $db -> Execute("SELECT user_name,user_id, user_parent, user_child FROM temida_users WHERE u
    ser_level <> 0 ORDER BY user_id"
    );
  5. foreach($row -> GetRows() as $cos){
  6. if($cos["user_parent"] != 0){
  7. $child_database = $db -> GetOne("SELECT user_child FROM temida_users WHERE user_id = '".$cos["user_parent"]."'");
  8. if(is_null($child_database)){
  9. $childs = array();
  10. }
  11. else{
  12. $childs = unserialize($child_database);
  13. }
  14. array_push($childs, $cos["user_id"]);
  15. $db -> Execute("UPDATE temida_users SET user_child = '".serialize($childs)."' WHERE user_id = '".$cos["user_parent"]."'");
  16. unset($childs);
  17. unset($child_database);
  18. unset($child);
  19. }
  20. }
  21.  
  22. ?>


kod dziala na tabeli:

  1. CREATE TABLE temida_users
  2. (
  3. user_id int8 NOT NULL DEFAULT NEXTVAL('temida_users_user_id_seq'::regclass),
  4. user_parent int8 DEFAULT 0,
  5. user_child text,
  6. }


w user_child znajduje sie zserialozowana tablica z dziecmi danego usera.

no i niestety juz przy okolo 1200 wpisach w bazie, czas dzialania tego skryptu na serwerkach nazwa.pl to ponad 100 sekund, az boje sie sprawdzac co bedzie jak bedzie tego wiece

ma ktos pomysł na zoptymalizowanie tego?


UPDATE:

przysniło mi sie conieco i taki kod:

  1. <?php
  2.  
  3. $db -> Execute("BEGIN");
  4. $db -> Execute("UPDATE temida_users SET user_child = NULL");
  5. $row = $db -> Execute("SELECT user_id, user_parent FROM temida_users WHERE user_level <> 0 ORDER BY user_id");
  6. $users = $row -> GetRows();
  7. $tree = array();
  8. foreach($users as $cos){
  9. if($cos["user_parent"] != 0){
  10. if(is_array($tree["".$cos["user_parent"].""])){
  11. array_push($tree["".$cos["user_parent"].""], $cos["user_id"]);
  12. }
  13. else{
  14. $tree["".$cos["user_parent"].""] = array();
  15. array_push($tree["".$cos["user_parent"].""], $cos["user_id"]);
  16. }
  17. }
  18. }
  19. foreach ($tree as $a => $b){
  20. $tree2[$a] =serialize($tree[$a]);
  21. }
  22. foreach ($tree2 as $a => $b){
  23. $db -> Execute("UPDATE temida_users SET user_child = '".$b."' WHERE user_id = '".$a."'");
  24. }
  25. $db -> Execute("COMMIT");
  26.  
  27. ?>


na tych samych danych czas dzialania 13 sekund. z czego 12 to wysłanie samych UPDATE do bazy, mysliCie ze da sie tutaj cos jeszcze wyciągnąc.

Ten post edytował AcidBurnt 28.12.2005, 01:14:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Wydaje mi się jednak, że jabbol ma rację.

Co prawda rozumiem, że idea zserializowanej tablicy ma zapewne zadanie optymalizowania pobierania tych danych.
Jeśłi jednak problem sprowadza się do pobrania dzieci danego rodzica, to zwykły left join lub prosta procedura, zwracająca tablicę dzieci w żadnen sposób nie spowolni działania skryptu.
A ty unikniesz ryzyka "wystepowania jakis problemów z systemem."
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 5.10.2025 - 02:06