php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 20-01-2008, 12:19
Laire
 Registrierter Benutzer
Links : Onlinestatus : Laire ist offline
Registriert seit: May 2004
Beiträge: 739
Laire ist zur Zeit noch ein unbeschriebenes Blatt
Standard [PHP / MySQL] Scriptoptimierung

Hallo,

es geht darum ein Teil meines Scriptes zu optimieren, da es extrem lange Laufzeiten hat. Es gibt bestimmt ein besserer Lösung nur fällt diese mir einfach nicht ein.

Es gibt zwei Tabellen. Tabelle A wird regelmäßig ausgelesen und dann in Tabelle B zusammengafasst und wieder gelöscht.

Also jetzt mal im Detail:

Tabelle A:
[ID] [A] [B]

Tabelle B:
[ID] [A] [B] [COUNT]

So jetzt habe ich im Schnitt in der Tabelle A 5000 Einträge, von denen mehrer doppelt vorkommen.
Ich möchte nun in Tabelle B eine Übersicht haben, welche Kombinationen vorkommen und wie oft. Es kommen bei jedem Durchgang ca. 1000 bis 2000 bekannt Kombinationen vor und der Rest sind neue. Daher hat Datenbank B dementsprechend viele Einträge. Hier meine momentane Lösung:

PHP-Code:
$abfrage mysql_query
("
   SELECT A, B, Count(A) 
      FROM Tabelle A 
      GROUP BY A, B
"
) OR die(mysql_error());
while(
$row mysql_fetch_array($abfrage))
{
   
$abfrageb mysql_query
   
("
      SELECT ID 
         FROM Tabelle B 
         WHERE A = '$row[0]' AND B = '$row[1]'
   "
);
    
$rowb mysql_fetch_array($abfrageb);

    if(
$rowb[0] != '')
    {
        
mysql_query("
           UPDATE Tabelle B 
           SET COUNT = COUNT + '$row[2]' 
           WHERE (ID ='$rowb[0]')
       "
) OR die(mysql_error());
     }
     else
     {
         
mysql_query("
             INSERT INTO Tabelle B (A, B, COUNT) 
             VALUES ('$row[0]', '$row[1]', '$row[2]')
        "
) OR die(mysql_error());
      }

Mit Zitat antworten
  #2 (permalink)  
Alt 20-01-2008, 12:52
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Setze in der Tabelle B Unique-Keys und benutze insert... on duplicate key update.

Noch viel besser wäre es aber, wenn du auf die Tabelle B komplett verzichtest, und die Informationen direkt aus Tabelle A abfragst wenn du sie benötigst.
__________________
ich glaube
Mit Zitat antworten
  #3 (permalink)  
Alt 20-01-2008, 14:05
Laire
 Registrierter Benutzer
Links : Onlinestatus : Laire ist offline
Registriert seit: May 2004
Beiträge: 739
Laire ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hm, da dieses dann später schneller abrufbar ist und auch so die Tabellengröße reduziert wird (es geht ja um pro Tag ca. 5000 Einträge die dadurch wegfallen) hätte ich es schon lieber so ;-)

So nun noch eine verstädniss Frage:

In der Anleitung heisst es:



Zitat:
Wenn Sie ON DUPLICATE KEY UPDATE angeben und ein Datensatz eingefügt wird, der einen doppelten Wert in einem eindeutigen Index oder einem Primärschlüssel erzeugen würde, dann wird für den alten Datensatz UPDATE ausgeführt. Angenommen, die Spalte a wird als UNIQUE deklariert und enthält den Wert 1; in diesem Fall hätten die beiden folgenden Anweisungen dieselbe Wirkung:
Also weder Spalte A noch Spalte B sind Uniqu oder Index, das ist ja die ID Spalte, geht das dann trotzdem?
Mit Zitat antworten
  #4 (permalink)  
Alt 20-01-2008, 14:31
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Laire
Hm, da dieses dann später schneller abrufbar ist und auch so die Tabellengröße reduziert wird (es geht ja um pro Tag ca. 5000 Einträge die dadurch wegfallen) hätte ich es schon lieber so ;-)
Das heißt du leerst Tabelle A anschließend? Wieso machst du dann überhaupt erst die Einträge und zählst nicht direkt die Kombinationen mit?
Zitat:
Also weder Spalte A noch Spalte B sind Uniqu oder Index, das ist ja die ID Spalte, geht das dann trotzdem?
Du musst halt einen Unique-Index über die Spaltenkombi A und B anlegen.
__________________
ich glaube
Mit Zitat antworten
  #5 (permalink)  
Alt 20-01-2008, 15:12
Laire
 Registrierter Benutzer
Links : Onlinestatus : Laire ist offline
Registriert seit: May 2004
Beiträge: 739
Laire ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ministry
Das heißt du leerst Tabelle A anschließend? Wieso machst du dann überhaupt erst die Einträge und zählst nicht direkt die Kombinationen mit?
Du musst halt einen Unique-Index über die Spaltenkombi A und B anlegen.

Es gibt noch weitere Spalten die wo anders ausgewertet werden...

Hm, da kommen wir in Bereiche in denen ich noch nie war ;-)

Wie wie gebe ich ein Unique über eine Spalten Kombi ?
Mit Zitat antworten
  #6 (permalink)  
Alt 20-01-2008, 15:17
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

unique ( A, B )


Btw: Ich würde die Queries aus der Schleife herausnehmen. Vor allem die Inserts kannst du zu einer Query zusammenfassen.

Geändert von PHP-Desaster (20-01-2008 um 15:20 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 20-01-2008, 17:01
Laire
 Registrierter Benutzer
Links : Onlinestatus : Laire ist offline
Registriert seit: May 2004
Beiträge: 739
Laire ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hm, und warum bekomme ich dann auf folgendes ne Fehlermedlung:

ALTER TABLE t1_cod4_nick CHANGE unique ( nick_key, nick_nick );
Mit Zitat antworten
  #8 (permalink)  
Alt 20-01-2008, 17:06
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

nicht CHANGE UNIQUE sondern ADD UNIQUE.
__________________
ich glaube
Mit Zitat antworten
  #9 (permalink)  
Alt 21-01-2008, 07:56
Laire
 Registrierter Benutzer
Links : Onlinestatus : Laire ist offline
Registriert seit: May 2004
Beiträge: 739
Laire ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Schon mal vielen dank für die hilfreichen Tipps.

Achja, wenn ich bei Insert mit mehreren Valeus arbeite, muss ich dann hinter jedem das ON DUPLICATE KEY UPDATE schreiben oder nur einmal ganz am Schluss?
Mit Zitat antworten
  #10 (permalink)  
Alt 21-01-2008, 11:47
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Achja, wenn ich bei Insert mit mehreren Valeus arbeite, muss ich dann hinter jedem das ON DUPLICATE KEY UPDATE schreiben oder nur einmal ganz am Schluss?
Nur ein mal.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:56 Uhr.