php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 28-05-2007, 14:00
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard preformance Problem

Hi Leute,

sicher ein Tema welches schon oft diskutiert wurde. Es geht bei der INSERT und bei der UPDATE Anweisung um die Preformance.
Sicher sind meine Indexe und SQL-Statements nicht die besten. Da ließe sich sicher noch einiges herausholen. Aber ich sags mal so: Trotz der Zugriffe die wir verzeichenen hinkt die Seite kein bisschen und ich wüßte auch gar nimmer welche Indexe ich noch setzen sollte.

Aber ich habe alle 10 Minuten einen Job der die DB ziehmlich beansprucht und ich weiß nicht mehr wie ich diesem Problem entgegentreten könnte.
Wir besitzen eine Web2 KFZ-Börse, welche zur Zeit grad mal an die 135.000 aktive PKW Inserate heranngekommen ist. Ich bekomme von den Händlern in Sammelftp-Ordnern die Inserate per ZIP-File.
Diese werden dann nach der Reihe abgearbeitet und in die Datenbank befördert. Entweder als INSERT wenn komplett neues KFZ eingetragen wurde, oder als UPDATE wenn sich nur Daten an einen bestehenden Inserat geändert haben. Somit bleibt auch die ID sehr lange gleich und ändert sich nicht dauernd, was auch bzg. Google schei.. wäre.

Das Abarbeiten der ZIP-Files soll in Kürze ein 2. Server machen, damit der Hauptserver davon verschont bleibt.
Es geht dann aber immer noch um die Inserts und Updates auf dem Hauptrechner.
Klar kann ich einen Insert mittles LOAD DATA machen, was sicher noch schneller ginge als der momentane Schritt über die Konsole:
PHP-Code:
exec("mysql --user=xxx --pass=xxx --host=xxx database < file.sql, $ret); 
Klar mache ich auch noch ein
PHP-Code:
/*!40000 ALTER TABLE `anzeigen` DISABLE KEYS */;
LOCK TABLES `anzeigenWRITE
und abschließend ein
PHP-Code:
UNLOCK TABLES;
/*!40000 ALTER TABLE `anzeigen` ENABLE KEYS */
Dazwischen sind die INSERT's und UPDATE's

Die SQL-Dateien welche dann eingespielt werden sind meistens so um die 5-9MB groß - es sind so zwischen 3.000 und 5.000 Datensätze die da eingefügt bzw. upgedatet werden.
Abschließend noch sei gesagt, dass ich beim INSERT nicht einzelne Inserts benutze sondern diese Variante
PHP-Code:
INSERT INTO `anzeigenVALUES ('blabla''blabla'blabla'),
('
blabla', 'blabla', blabla'),
(
'blabla''blabla'blabla),
... 
Ich glaub auch nicht, dass die Insertanweisungen das lamende Thema sind, sondern die UPDATE-Anweisungen, welche wesendlich mehr sind als die INSERT-Anweisungen.
Jedenfalls fährt mir mysql immer auf über 93% Prozessorleistung.
Das kanns ja wohl nicht sein? Oder doch?

Hat irgendwer von euch für mich Tipps oder Ratschläge, damit ich dieses Problem aus der Welt schaffen kann?

Benutzte Konfiguration:
PHP 5.1.4
MYSQL 4.1.10a-Max-log

lg.
Werner
Mit Zitat antworten
  #2 (permalink)  
Alt 28-05-2007, 19:21
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Index haben Vor- und Nachteile. Man muss es bei Erstellung abwägen, denn Index beschleunigt zwar die Suche/das Auslesen, bremst aber auch das Einfügen. Also, wenn du sehr viel INSERT-Aktionen täglich hast, dann geht mit Index vorsichtig um. Lieber die User etwas warten lassen, als den kompletten DB-Server einfrieren.
Mit Zitat antworten
  #3 (permalink)  
Alt 28-05-2007, 20:17
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

soetwas in der Art dachte ich mir schon :-(
In der Tat war heute mein Table 'anzeigen' bereits über 2GB groß.
Nach einen Optimice war er wieder auf 170MB herunten.
Das meiste fressen die Indexe.

Ich weiß nicht ob ich das richtige mache wenn ich bei meinen SELECT Anweisungen statt einen normalen "SELECT ......" ein "SELECT SQL_CACHE...." mache.
Ich werds einfach mal probieren und die gesetzten Indexe heraussichern.
Und dann werde ich den Unterschied eh merken.

Das ich eventuell die User etwas warten lassen muß gefällt mir halt so gra nicht. Zumal jetzt ein B2B Bereich für KFZ-Händler angestrebt wird.
Und wenn die auf der Seite ausgebremst werden ist es nicht grad die feine englische Art.
Aber ich entferne ja nur aus dem Table anzeigen mal die Indexe und schau was passiert.
Heute ist sowieso - ausser der Importmenge - fast nix los vom Traffic.
Da kann ich das mal verschmerzen und ggf. ja wieder hinzufügen die Indexe.

Ich gebe dann mal Bescheid wie das Ergebnis war/ist

lg.
Werner
Mit Zitat antworten
  #4 (permalink)  
Alt 28-05-2007, 21:50
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Auch einen Versuch wert: Index droppen, Updates/Inserts ausführen, Index wieder adden. MySQL muß dann zwar den Index komplett neu bauen, aber das geht u.U. schneller, als ihn die ganze Zeit parallel zu pflegen.
Mit Zitat antworten
  #5 (permalink)  
Alt 28-05-2007, 22:36
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
Auch einen Versuch wert: Index droppen, Updates/Inserts ausführen, Index wieder adden. MySQL muß dann zwar den Index komplett neu bauen, aber das geht u.U. schneller, als ihn die ganze Zeit parallel zu pflegen.
Hi,

lieb gemeint aber ist das nicht das selbe was ich nicht oben bereits erwähnte??
PHP-Code:
/*!40000 ALTER TABLE `anzeigen` DISABLE KEYS */;
/*!40000 ALTER TABLE `anzeigen` ENABLE KEYS */
Ich hab die Indexe mal sehr stark reduziert und bei jeder SELECT Anweisung die SQL_CACHE hinzugefügt.
Aber gleich gescheit, damit ichs in der zentralen config.php aktivieren bzw. deaktivieren kann.

Was mich in diesem Zuge interessieren würde wäre, wie lange die Abfragen im Cache liegen bleiben?
Was ich weiß ist, dass der älteste geschmissen wird wenn er voll ist - oder lieg ich da falsch.
Von der Performance her spühre ich drotz weniger Indexe eine deutliche Steigerung der Abfragegeschwindigkeit, auch wenn mir die errechneten Millisekunden die ich zum debuggen anzeige das Gegenteil zeigen. Da hat sich nicht wirklich was verändert. Könnte aber am SQL_CACHE liegen, da der etwas von der Performance zerrt, soweit ich das auf mysql.de gelesen habe.

lg.
Werner
Mit Zitat antworten
  #6 (permalink)  
Alt 29-05-2007, 13:10
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wieso lockst du die Tabelle?
Wenn dir dazu keine passende Antwort einfällt (denn mir fällt für diesen Fall keine ein), lass es
Mit Zitat antworten
  #7 (permalink)  
Alt 29-05-2007, 13:30
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Locken tu ich weil es auch auf der Mysql-Doku als Performanceerhöhung steht. http://dev.mysql.com/doc/refman/5.1/...ert-speed.html

Zitat:
Wenn dir dazu keine passende Antwort einfällt (denn mir fällt für diesen Fall keine ein), lass es
Ich nehme mal an, dass sich das auf den Befehl
PHP-Code:
LOCK TABLES a WRITE
bezieht......
Mit Zitat antworten
  #8 (permalink)  
Alt 29-05-2007, 14:32
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von web4free
Locken tu ich weil es auch auf der Mysql-Doku als Performanceerhöhung steht. http://dev.mysql.com/doc/refman/5.1/...ert-speed.html
*hust* ... ja ... was da nicht steht ist, dass bei einem WRITE-Lock alle anderen Connections, wenn sie auf die Tabelle zugreifen wollen, darauf warten, dass der Lock verschwindet. Wenn jetzt dein DB-Server max_connections=100 hat und alle 100 Verbindungen darauf warten, dass der Lock verschwindet, ist deine komplette Website tot...

Abgesehen davon sollte man den Absatz auch bitte bis zum Ende lesen:
Zitat:
Explizite Sperranweisungen sind nicht erforderlich, wenn Sie alle Datensätze mit einer einzelnen INSERT-Anweisung einfügen können.
und genau das tust du.


Abgesehen davon poste mal bitte die Tabellen-Struktur~
Mit Zitat antworten
  #9 (permalink)  
Alt 29-05-2007, 14:51
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Naja nur inserts sinds ja leider keine. Das meiste sind die Updates.
Das Verhältnis ist so 4:6 - also auf 10 Inserate kommen 4 inserts (also neue Inserate) und 6 Updates bestehender Inserate.

Ich geh einfach mal her und deaktiviere im den LOCK und schau weiter.
Jedenfalls ist das Ausbremsen schon deutlich geringer - was dann, wenn die Hauptaufgaben am 2. Server ablaufen, nochmals weniger wird, weils dann wirklich nur mehr um die INserts und Updates geht.

Scheinbar hilft alle Theorie nix und man muß scheinbar bei einigen Sachen dieses erst in der Praxis sehen und kennenlernen ;-)

Aber danke mal für diesen Hinweis.
Die Tabellenstruktur würde ich gerne nicht öffentlich zeigen, weil ich mich dafür geniere und mich sicher einige schimpfen werden.
Auf der anderen Seite könnte mir da vielleicht auch mal einer einen Tipp geben wo ich was falsch gemacht habe :-)

Ich überlegs mir noch, ok? ;-)

lg.
Werner
Mit Zitat antworten
  #10 (permalink)  
Alt 30-05-2007, 09:29
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von web4free
Aber danke mal für diesen Hinweis.
Die Tabellenstruktur würde ich gerne nicht öffentlich zeigen, weil ich mich dafür geniere und mich sicher einige schimpfen werden.
Auf der anderen Seite könnte mir da vielleicht auch mal einer einen Tipp geben wo ich was falsch gemacht habe :-)

Ich überlegs mir noch, ok? ;-)
Na, nachdem was wir hier schon alles gesehen haben ... ich glaube das kannst du nicht übertreffen ^^;
Mit Zitat antworten
  #11 (permalink)  
Alt 30-05-2007, 12:33
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok! Auf eigene Gefahr hin komme ich dem Wunsch gleich nach und poste Euch mal meine Tabellenstruktur.
Wird aber noch ein bisserl dauern, da ich nochmals die Feldwerte überarbeite.

Und dann könnt Ihr über mich schimpfen
Wenn es aber Verbesserungsvorschläge gibt bin ich natürlich säuisch erfreut und dankbar dafür.
Mit Zitat antworten
  #12 (permalink)  
Alt 30-05-2007, 13:53
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So anbei die Struktur wie sie zur Zeit ist.
Wenns noch wichtige Dinge gibt die zu wissen sind sagt es mir bitte.
PHP-Code:
CREATE TABLE `anzeigen` (
`
idbigint(11unsigned NOT NULL auto_increment,
`
Datumint(10NOT NULL default '0',
`
Bild1varchar(39NOT NULL default '',
`
angebotdestagesint(1NOT NULL default '0',
`
Bild2varchar(39NOT NULL default '',
`
Bild3varchar(39NOT NULL default '',
`
Bild4varchar(39NOT NULL default '',
`
Bild5varchar(39NOT NULL default '',
`
Bild6varchar(39NOT NULL default '',
`
Herstellervarchar(100NOT NULL default '',
`
Modellvarchar(100NOT NULL default '',
`
modellfreitextvarchar(100NOT NULL default '',
`
Fahrzeugtypvarchar(30NOT NULL default '',
`
Motorint(10NOT NULL default '0',
`
Kraftstoffvarchar(30NOT NULL default '',
`
Getriebevarchar(30NOT NULL default '',
`
Erstzulassungdecimal(5,4NOT NULL default '0.0000',
`
Kilometerint(20NOT NULL default '0',
`
Farbevarchar(200NOT NULL default '',
`
FarbeGlobalvarchar(200NOT NULL default '',
`
Tuerenint(1NOT NULL default '0',
`
Preisdecimal(10,2NOT NULL default '0.00',
`
TUeVdecimal(5,4NOT NULL default '0.0000',
`
AUdecimal(5,4NOT NULL default '0.0000',
`
uservarchar(100NOT NULL default '',
`
Textlongtext NOT NULL,
`
Typvarchar(30NOT NULL default '',
`
Zylinderint(2NOT NULL default '0',
`
Hubraumint(10NOT NULL default '0',
`
Sitzeint(2NOT NULL default '0',
`
Leergewichtint(6NOT NULL default '0',
`
toplistint(1NOT NULL default '0',
`
aktivint(1NOT NULL default '1',
`
HUdecimal(5,4NOT NULL default '0.0000',
`
mwstint(1NOT NULL default '0',
`
vbvarchar(200NOT NULL default '',
`
verbrauchAdouble(3,2NOT NULL default '0.00',
`
verbrauchBdouble(3,2NOT NULL default '0.00',
`
verbrauchCdouble(3,2NOT NULL default '0.00',
`
Fgstnrvarchar(200NOT NULL default '',
`
cozweiint(10NOT NULL default '0',
`
Ausstattunglongtext NOT NULL,
`
Komfortlongtext NOT NULL,
`
landregionvarchar(200NOT NULL default '',
`
klassifizierungvarchar(200NOT NULL default '',
`
counterint(10NOT NULL default '0',
`
einstelldauerint(4NOT NULL default '0',
`
freeidvarchar(200NOT NULL default '',
`
suchwort1varchar(200NOT NULL default '',
`
suchwort2varchar(200NOT NULL default '',
`
suchwort3varchar(200NOT NULL default '',
`
suchwort4varchar(200NOT NULL default '',
`
suchwort5varchar(200NOT NULL default '',
`
bilderveroeffentlichenint(1NOT NULL default '0',
`
unfallfahrzeugint(1NOT NULL default '0',
`
internenummervarchar(200NOT NULL default '',
`
importwherevarchar(30NOT NULL default '',
`
landcodechar(3NOT NULL default '',
`
fartvarchar(4NOT NULL default '',
PRIMARY KEY  (`id`),
KEY `Hersteller` (`Hersteller`),
KEY `Modell` (`Modell`),
KEY `user` (`user`,`internenummer`,`importwhere`)
ENGINE=MyISAM DEFAULT CHARSET=latin1
Mit Zitat antworten
  #13 (permalink)  
Alt 30-05-2007, 14:14
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hm... da sind ne Menge varchar und longtext-Spalten oo,
Und der user-index über 3 varchar-Spalten mit einer gesamt-Länge von 330 Zeichen ist nicht gerade prickelnd, aber naja ... hm

Farbe varchar(200) könnte man eventuell ein enum draus machen
user varchar(100)? Hast du keine user-Tabelle wo du mit ids arbeitest, sodass man das varchar-Feld in ein id-Feld umändern könnte?

Hersteller könnte man auslagern in eine eigene Tabelle und nur dessen id dann in der Tabelle hier speichern; Stichwort Normalisierung

Aber es ging mir ja eigentlich mehr um die Indizes ^^;


Zeig mal bitte die UPDATE-Queries aus dem Dump (einen von jeder Sorte ... du brauchst nicht ein Dutzend Queries posten, die im Endeffekt alle gleich sind nur andere Werte in anderen Zeilen ändern) und am besten auch gleich die Ausgabe von EXPLAIN
Die Update-Queries dürften ja irgendwie so aussehen:
UPDATE tabelle SET spalte=wert, spalte2=wert WHERE bla="blubb";
Und du setzt dann mal für alle der verschiedenen Update-Queries die du uns hier postest einen Query allá
EXPLAIN SELECT * FROM tabelle WHERE bla="blubb";
ab - also einfach einen SELECT mit der Where-Klausel vom Update
Mit Zitat antworten
  #14 (permalink)  
Alt 30-05-2007, 14:15
Wyveres
 Registrierter Benutzer
Links : Onlinestatus : Wyveres ist offline
Registriert seit: Dec 2006
Ort: Rügen
Beiträge: 763
Blog-Einträge: 2
Wyveres ist zur Zeit noch ein unbeschriebenes Blatt
Wyveres eine Nachricht über ICQ schicken
Standard

so ganz ins Blaue gesagt würde ich jetzt erlich gesagt laut schreiend davon rennen.

so wie es aussieht Befindet sich die DB tabelle NUR in der 1. Normalform.

vieleicht solltest du sie Normalisieren. das vermindert den aufwand des Updaten/Insert um einiges. auch wenn es dadurch Komplizierter wirkt. (kein Insert mehr in eine Tabelle sondern in mehrere)
würde es doch viel Zeit einsparen.

Zitat:
Original geschrieben von ghostgambler

Na, nachdem was wir hier schon alles gesehen haben ... ich glaube das kannst du nicht übertreffen ^^;
also vom dem was ich bisher gesehen habe ist das hier das Monströsteste. aber es ist wenigstens nicht totaler misst.

deswegen mein TIP: von der 1. Normalform in die 3. Normalform bringen.
wirst Sehen der Aufwand wird sich Lohnen.
__________________
Bitte Beachten.
Foren-Regeln
Danke
Mit Zitat antworten
  #15 (permalink)  
Alt 30-05-2007, 14:30
web4free
 Newbie
Links : Onlinestatus : web4free ist offline
Registriert seit: Jun 2005
Beiträge: 108
web4free ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Antwort siehe weiter unten...

Geändert von web4free (30-05-2007 um 14:47 Uhr)
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 00:01 Uhr.