Avatar billede straszek Praktikant
13. december 2005 - 21:12 Der er 8 kommentarer og
1 løsning

Hjælp til hastigheds optimering

Jeg har fået bakset nedenstående kode sammen der sådan set virker fint nok, med det er meget langsom - den tager mange minutter om at udføre nedenstående. Så jeg har brug for noget hjælp til at gøre koden "hurtigere".

$sqlPerson indeholder mellem 1 og 25 poster.
$sqlOpgave indeholder op til 2200 poster


$sqlPerson = "select bruger_id from rundringning_udvalg_users where rund_id='".$_GET['rundid']."'";
$queryPerson = mysql_query($sqlPerson) or die(mysql_error());
while ($row = mysql_fetch_assoc($queryPerson))
{
    $person[] = $row["bruger_id"];
}

$opgave = array();

$sqlOpgave = "select skole_id FROM rundringer_udvalg where tildelt='0' AND rundringning='".$_GET['rundid']."'";
$queryOpgave = mysql_query($sqlOpgave) or die(mysql_error());
while ($row = mysql_fetch_assoc($queryOpgave))
{
    $opgave[] = $row["skole_id"];
}

$personNo = 0;
for ($opgaveNo=0; $opgaveNo<count($opgave); $opgaveNo++)
{
 


$insertSQL = "INSERT INTO rundringer_tildelt  (rund_id, skole_id, bruger_id) VALUES ('".$_GET['rundid']."', '$opgave[$opgaveNo]', '$person[$personNo]')" or die(mysql_error());
mysql_query($insertSQL);
Mysql_query ("UPDATE rundringer_udvalg set tildelt ='1' WHERE rundringning='".$_GET['rundid']."' AND skole_id='$opgave[$opgaveNo]' ") or die(mysql_error());

    $personNo++;
    if ($personNo == count($person))
        $personNo = 0;
}
Avatar billede there-is-only-xul Nybegynder
13. december 2005 - 21:18 #1
jeg kigger lige på det..

jeg vil gerne se din database (SQL) struktur også, evt. et diagram, fordi det kan typisk hjælp MEGET at optimere databasen istedet for php.
Avatar billede there-is-only-xul Nybegynder
13. december 2005 - 21:27 #2
Umidbart kan dit PHP ikke gøres meget hurtigere, kun pænere

Jeg tror vi skal have fat i ondets rod, nemlig din SQL struktur, en forklaring af formålet af koden, ville også hjælpe gevaldigt.

Her er en pænere og mere læsbar udgave + rettede nogle småfejl.
<?php

// $sqlPerson indeholder mellem 1 og 25 poster.
// $sqlOpgave indeholder op til 2200 poster

if(isset($_GET['rundid']))
{
  $rundID = addslashes($_GET['rundid']); // ingen SQL injections, tak
 
  $sqlPerson = "SELECT
                        bruger_id
                FROM
                        rundringning_udvalg_users
                WHERE
                        rund_id='".$rundID."'
                ";
 
  $queryPerson = mysql_query($sqlPerson) or die(mysql_error());
 
  $person = array(); // husk at init dine variable
  while($row = mysql_fetch_assoc($queryPerson))
  {
    $person[] = $row['bruger_id'];
  }
 
  $sqlOpgave = "SELECT
                      skole_id
                FROM
                      rundringer_udvalg
                WHERE
                      tildelt='0'
                AND
                      rundringning='".$rundID."'
                ";
 
  $queryOpgave = mysql_query($sqlOpgave) or die(mysql_error());
 
  $opgave = array();
  while($row = mysql_fetch_assoc($queryOpgave))
  {
    $opgave[] = $row['skole_id'];
  }
 
  $personNo = 0;
  for($opgaveNo=0;$opgaveNo<count($opgave);$opgaveNo++)
  {
    $insertSQL = "INSERT INTO
                              rundringer_tildelt(
                                                rund_id
                                                ,skole_id
                                                ,bruger_id
                                                )
                              VALUES (
                                      '".$rundID."'
                                      ,'".$opgave[$opgaveNo]."'
                                      ,'".$person[$personNo]."'
                                    )
                ";
    mysql_query($insertSQL) or die(mysql_error());

    $updateSQL = "UPDATE
                          rundringer_udvalg
                  SET
                          tildelt ='1'
                  WHERE
                          rundringning='".$rundID."'
                  AND
                          skole_id='".$opgave[$opgaveNo]."'
                  ";
    mysql_query($updateSQL) or die(mysql_error());
    $personNo++;
    if($personNo == count($person)) { $personNo = 0; }
  }

}

?>
Avatar billede straszek Praktikant
13. december 2005 - 21:52 #3
Okay jeg skal prøve at forklare:

rundringning_udvalg_users:
Struktur:
`rund_id` int(11) NOT NULL default '0',
  `bruger_id` int(11) NOT NULL default '0'

Indeholder oplysninger om brugere der skal anvendes til en opgave

rundringer_udvalg
Stuktur:
`tildelt` int(5) NOT NULL default '0',
  `rundringning` int(5) NOT NULL default '0',
  `skole_id` int(5) NOT NULL default '0'
) TYPE=MyISAM;

Indeholder oplysninger om hvilke skoler der skal bruges til en given opgave.

rundringer_tildelt
Struktur:
id` int(11) NOT NULL auto_increment,
  `rund_id` int(5) NOT NULL default '0',
  `skole_id` int(6) NOT NULL default '0',
  `bruger_id` int(4) NOT NULL default '0',
  `status` int(3) NOT NULL default '0',
  `interesse` int(3) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=6466 ;

Indeholder oplysninger om hvilke brugere der er tildelt hvilke opgaver(skoler)

Så det koden gør er at finde ud af hvor mange brugere der er til et projekt, og så fordel disse brugere til de opgaver(skoler) der er i projektet således at de får tildelt lige mange opgaver.
Avatar billede there-is-only-xul Nybegynder
13. december 2005 - 22:11 #4
okay, prøver at kigge på det.
Avatar billede there-is-only-xul Nybegynder
13. december 2005 - 22:29 #5
Jeg vil forestlå en SQL struktur nærmere, dette her:

--
-- Database: `exp671944`
--

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

--
-- Struktur-dump for tabellen `rdr_tildelt`
--

CREATE TABLE `rdr_tildelt` (
  `tildeltID` int(11) NOT NULL auto_increment,
  `rundID` int(11) NOT NULL default '0',
  `skoleID` int(11) NOT NULL default '0',
  `brugerID` int(11) NOT NULL default '0',
  `intStatus` int(11) NOT NULL default '0',
  `intInteresse` int(11) NOT NULL default '0',
  PRIMARY KEY  (`tildeltID`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

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

--
-- Struktur-dump for tabellen `rdr_udvalg`
--

CREATE TABLE `rdr_udvalg` (
  `udvalgID` int(11) NOT NULL auto_increment,
  `intTildelt` int(11) NOT NULL default '0',
  `rundID` int(11) NOT NULL default '0',
  `skoleID` int(11) NOT NULL default '0',
  PRIMARY KEY  (`udvalgID`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


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

--
-- Struktur-dump for tabellen `rdr_udvalg_bruger`
--

CREATE TABLE `rdr_udvalg_bruger` (
  `brugerID` int(11) NOT NULL auto_increment,
  `rundID` int(11) NOT NULL default '0',
  PRIMARY KEY  (`brugerID`)
) TYPE=MyISAM AUTO_INCREMENT=16 ;

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

Jeg prøver lige at lave nogle falske data, og nogle hastighedstest.
Avatar billede there-is-only-xul Nybegynder
13. december 2005 - 22:38 #6
Dette her script, kører 1000 rækker igennem på ca. 8 sekunder.

<?php

$conn = mysql_connect('localhost','root','');
$db  = mysql_select_db('exptest');

// $sqlPerson indeholder mellem 1 og 25 poster.
// $sqlOpgave indeholder op til 2200 poster

if(isset($_GET['rundid']))
{
  $rundID = addslashes($_GET['rundid']); // ingen SQL injections, tak
 
  $sqlPerson = "SELECT
                        brugerID
                FROM
                        rdr_udvalg_bruger
                WHERE
                        rundID='".$rundID."'
                ";
 
  $queryPerson = mysql_query($sqlPerson) or die(mysql_error());
 
  $person = array(); // husk at init dine variable
  while($row = mysql_fetch_assoc($queryPerson))
  {
    $person[] = $row['brugerID'];
  }
 
  $sqlOpgave = "SELECT
                      skoleID
                FROM
                      rdr_udvalg
                WHERE
                      intTildelt='0'
                AND
                      rundID='".$rundID."'
                ";
 
  $queryOpgave = mysql_query($sqlOpgave) or die(mysql_error());
 
  $opgave = array();
  while($row = mysql_fetch_assoc($queryOpgave))
  {
    $opgave[] = $row['skoleID'];
  }
 
  $personNo = 0;
  for($opgaveNo=0;$opgaveNo<count($opgave);$opgaveNo++)
  {
    $insertSQL = "INSERT INTO
                              rdr_tildelt(
                                          rundID
                                          ,skoleID
                                          ,brugerID
                                          )
                              VALUES (
                                      '".$rundID."'
                                      ,'".$opgave[$opgaveNo]."'
                                      ,'".$person[$personNo]."'
                                    )
                ";
   
    mysql_query($insertSQL) or die(mysql_error());
   
    $updateSQL = "UPDATE
                          rdr_udvalg
                  SET
                          intTildelt ='1'
                  WHERE
                          rundID='".$rundID."'
                  AND
                          skoleID='".$opgave[$opgaveNo]."'
                  ";
    mysql_query($updateSQL) or die(mysql_error());
    $personNo++;
    if($personNo == count($person)) { $personNo = 0; }
  }
}

?>
Avatar billede straszek Praktikant
13. december 2005 - 23:18 #7
Det ser spændende ud - jeg orker ikke kigge mere på det i dag, men jeg giver svar i løbet af de næste par dag.


Søren
Avatar billede straszek Praktikant
28. december 2005 - 13:16 #8
Så blev der tid til at kigge på det. Jeg har fået halveret hastigheden, så det må siges at være acceptabelt.

Smid et svar :-)
Avatar billede there-is-only-xul Nybegynder
30. december 2005 - 17:15 #9
ok :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester