Avatar billede dk-coders Nybegynder
25. januar 2015 - 00:15 Der er 7 kommentarer og
1 løsning

Indsæt i mysql hvis ny ellers opdater

Hej,

Jeg har et array med mange rækker.. Tænker at det kan lade sig gøre at sende en forespørgsel til mysql én gang for at gøre processen hurtigere..

Jeg har følgende array:

$arr = array("navn1", "navn2", "navn3");

MySQL:
navn
dato


Jeg tænker at jeg kan forespørge mysql via én query, hvor der skal indsættes rækker i mysql via navne fra $arr.

Når navnene indsættes, skal dato være NOW().. Opdateres rækkes, skal dato opdateres til NOW()..

Kan dette lade sig gøre via én forespørgsel?
Avatar billede moddi100 Seniormester
25. januar 2015 - 01:38 #1
Hvor mange rækker snakker vi om? Normalt kan du opnå et boost ved at anvende prepared statements, som så gentages. På den måde slipper du får en del overhead fra databasen af:

http://php.net/manual/en/pdo.prepare.php

For hver række bør du anvende syntaksen:
INSERT INTO <table> (navn, dato) VALUES (?, NOW()) ON DUPLICATE KEY UPDATE dato=NOW()


For at det virker, skal du dog ind i databasen og sætte kolonnen navn til 'primary' eller 'unique'. Men det vil netop virke som du ønsker.
Avatar billede dk-coders Nybegynder
25. januar 2015 - 12:07 #2
Lyder spændende..

Jeg har rækker fra ca 2.000 op til 20.000, som umiddelbart er maks..

Ville du bruge din syntaks i et loop?
Avatar billede moddi100 Seniormester
25. januar 2015 - 14:09 #3
I så fald er der ingen tvivl om at du skal anvende prepared statements. Nu ved jeg ikke om du bruger PDO eller mysqli, men begge kan anvendes:

[div]$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

// Dine data hvorend de kommer fra
$data = array("navn1", "navn2", "navn3");

try
{
    // Opret forbindelse
    $dbh = new PDO($dsn, $user, $password);

    // Klargør statement
    $sql = "INSERT INTO <table> (navn, dato) VALUES (?, NOW()) ON DUPLICATE KEY UPDATE dato=NOW()";

    // Vigtigt at denne linje holdes udenfor loopet, da det kun skal ske én gang. Ellers opnår du et stort overhead
    $stmt = $dbh->prepare($sql);

   
    // Loop igennem rækkerne og indsæt hver enkelt værdi
    // 20.000 rækker burde ikke være noget problem, når
    // denne form anvendes. Det kommer selvfølgelig an på
    // din server og begrænsningerne herpå.
    foreach($data as $name)
    {
      $stmt->execute(array($name));
    }
} catch (PDOException $e) {
    echo 'Fejl: ' . $e->getMessage();
}
Avatar billede moddi100 Seniormester
25. januar 2015 - 14:09 #4
Vi prøver lige igen, så det ser ordentligt ud (samme kode):

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

// Dine data hvorend de kommer fra
$data = array("navn1", "navn2", "navn3");

try
{
    // Opret forbindelse
    $dbh = new PDO($dsn, $user, $password);

    // Klargør statement
    $sql = "INSERT INTO <table> (navn, dato) VALUES (?, NOW()) ON DUPLICATE KEY UPDATE dato=NOW()";

    // Vigtigt at denne linje holdes udenfor loopet, da det kun skal ske én gang. Ellers opnår du et stort overhead
    $stmt = $dbh->prepare($sql);

   
    // Loop igennem rækkerne og indsæt hver enkelt værdi
    // 20.000 rækker burde ikke være noget problem, når
    // denne form anvendes. Det kommer selvfølgelig an på
    // din server og begrænsningerne herpå.
    foreach($data as $name)
    {
      $stmt->execute(array($name));
    }
} catch (PDOException $e) {
    echo 'Fejl: ' . $e->getMessage();
}
Avatar billede dk-coders Nybegynder
25. januar 2015 - 19:33 #5
Jeg bruger mysqli..

Kan det ikke udføres med mindre kode med én enkelt forespørgsel? Eller er det for at undgå at overbelaste databasen?
Avatar billede moddi100 Seniormester
25. januar 2015 - 19:49 #6
Du rammer hurtigt et maks på hvor mange rækker du kan indsætte på én gang med et insert-statement.

Og ja det er netop optimeret til at belaste serveren mindst muligt.
Avatar billede dk-coders Nybegynder
01. februar 2015 - 23:02 #7
Tak - kvitter med et svar :-)
Avatar billede moddi100 Seniormester
01. februar 2015 - 23:22 #8
Velbekomme :)
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