geschwindigkeit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • AmicaNoctis
    antwortet
    Wenn dein Hoster es anbietet (in einem anderen Thread meinte der TO, dass sein Hoster es nicht tut), solltest du immer InnoDB als (Standard-)Engine auswählen, wenn du eine DB (eigentlich Schema) und darin Tabellen anlegst. MyISAM macht nur in Ausnahmefällen Sinn, auf die ich jetzt aber nicht näher eingehen will.

    In PHPMyAdmin kannst du dann auch echte Fremdschlüsselconstraints anlegen, durch welche die referentielle Integrität sichergestellt ist. Damit nimmt dir das DBMS auch noch Arbeit ab, die sonst in Form zusätzlicher Überprüfungen im Code notwendig wäre.

    Die Normalformen sind z. B. schon bei Wikipedia ganz vernünftig erklärt, aber es gibt im Netz massig Ressourcen, wo das speziell für Anfänger noch besser und verständlicher rübergebracht wird.

    Bis zur 3. Normalform (3NF) oder zur BCNF sollte deine Datenbank mindestens normalisiert sein.

    Da wäre jetzt mal eine Google-Session mit anschließender Lektüre und evtl. noch ein paar Tutorials sinnvoll, sonst kommst du früher oder später in Situationen, wo du dir wünschst, dass du es lieber gleich richtig strukturiert hättest.
    Zuletzt geändert von AmicaNoctis; 23.11.2009, 23:44.

    Einen Kommentar schreiben:


  • keks333
    antwortet
    PHP-Code:
    CREATE TABLE picvotes (
       
    userid int(11) DEFAULT '0' NOT NULL,
       
    bildid int(11) DEFAULT '0' NOT NULL,
       
    wann int(11) DEFAULT '0' NOT NULL,
       
    vote tinyint(4) DEFAULT '0' NOT NULL,
       
    KEY bildid (bildid)
    ); 
    ja wie gesagt das optimieren der tabellen is noch neuland. hab ich bis jetz auch unterschätzt

    myisam, innodb & NF sagt mir auch nix ^^

    aber danke schon mal für die hilfe.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Und das Create Table der anderen Tabelle?

    Der Index auf bildid ist überflüssig, weil der sich mit dem Primärschlüssel deckt. Gut wäre noch einer auf die owner-Spalte. (In PHPMyAdmin geht das ja auch ganz leicht über den Blitz-Button.)

    Ist das MyISAM oder InnoDB? Ich sehe gar keine Fremdschlüssel. Normalisiert ist das auch noch nicht richtig, wenn ich mir z. B. die Spalten comments und tags ansehe, klingt das als wäre es nicht mal 1.NF. Da wäre eigentlich noch Verbesserungspotential alleine in der Struktur der DB. Wenn es um Geschwindigkeit geht, sollten diese Sachen an erster Stelle stehen. Auch die durchoptimiertesten Abfragen bringen da keine nennenswerten Verbesserungen mehr.

    Einen Kommentar schreiben:


  • keks333
    antwortet
    Zitat von AmicaNoctis Beitrag anzeigen
    Poste bitte mal die Create-Table-Statements. Im PHPMyAdmin geht das ganz einfach über die Export-Funktion: nur Struktur, ohne Daten. Dann sehen wir weiter.
    die bildtabelle wo er imernoch alle bilder ausliest und vergleicht obwohl er ja nur eines brauch... oder is des normal?

    PHP-Code:
    CREATE TABLE loungebilder (
       
    owner int(11) DEFAULT '0' NOT NULL,
       
    ownernick text NOT NULL,
       
    galerie int(11) DEFAULT '0' NOT NULL,
       
    bildnr varchar(11) DEFAULT '0' NOT NULL,
       
    datei varchar(20) DEFAULT '0' NOT NULL,
       
    allow_c tinyint(4) DEFAULT '0' NOT NULL,
       
    bildid int(11NOT NULL auto_increment,
       
    uploadtime int(11) DEFAULT '0',
       
    titel tinytext NOT NULL,
       
    text text NOT NULL,
       
    kategorie text NOT NULL,
       
    pcount int(11) DEFAULT '0' NOT NULL,
       
    comments int(6) DEFAULT '0' NOT NULL,
       
    favs tinyint(6) DEFAULT '0' NOT NULL,
       
    tags varchar(200NOT NULL,
       
    book tinyint(4) DEFAULT '0' NOT NULL,
       
    booknr varchar(4NOT NULL,
       
    votes int(6) DEFAULT '0' NOT NULL,
       
    summe int(11) DEFAULT '0' NOT NULL,
       
    ergebnis varchar(6) DEFAULT '0' NOT NULL,
       
    allow_v tinyint(4) DEFAULT '0' NOT NULL,
       
    PRIMARY KEY (bildid),
       
    KEY bildid (bildid),
       
    KEY allow_v (allow_v)
    ); 

    Einen Kommentar schreiben:


  • keks333
    antwortet
    oh mann ... das ich des indexieren im phpmyadmin machen muss ... da lag des problem... dacht immer das muss ins script.

    die seite läuft jetz. zack und da... der NOT IN befehl (oder auch left join) besteht jetz nur noch aus einer zeile und es rockt....

    bei der primary tabelle werden immernoch alle datensätze ausgelesen und verglichen aber des geht flott.

    so siehts jetz aus

    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE l ALL 1062 Using where; Using temporary; Using filesort Ändern Löschen
    1 SIMPLE p ref bildid bildid 4 d00c2e77.l.bildid 1 Using where; Not exists

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Poste bitte mal die Create-Table-Statements. Im PHPMyAdmin geht das ganz einfach über die Export-Funktion: nur Struktur, ohne Daten. Dann sehen wir weiter.

    Einen Kommentar schreiben:


  • combie
    antwortet
    DB Speed Faustregel:
    1. Alle Spalten, welche im WHERE Teil vorkommen, sollten mit einem Index versehen werden. Das beschleunigt Zugriffe ungemein!
    2. Je mehr Spalten es mit einem Index in der betreffenden Tabelle gibt, desto langsammer sind INSERT, DELETE und UPDATE.
    3. Da auch DELETE und UPDATE oft einen WHERE Teil haben, siehe Punkt 1
    4. Da meist Lesezugriffe überwiegen, lohnt sich oft ein vorsortieren der Daten: "ALTER TABLE `tabelle` ORDER BY `spalte` ASC"
    *grob vereinfacht*

    Einen Kommentar schreiben:


  • keks333
    antwortet
    ich bitte dich , nein sonst hätte ichs kapiert. auf welche spalten kommt es an . alle die man abfragt ? poste doch bitte EINMAL wie es auszusehen hat. ein konkretes beispiel gibs sooo selten (bzw gar nicht) im netz und würde sicherlich helfen.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Zitat von keks333 Beitrag anzeigen
    wo setze ich da am besten den index damits was taugt???
    Ich bitte dich. Das wurde aber nun zur Genüge geklärt:

    Zitat von AmicaNoctis Beitrag anzeigen
    Du indizierst einfach die richtigen* Spalten und schon geht alles schneller. Das ist alles

    ___
    * die richtigen sind solche, die von Joins mit on oder using benutzt werden oder in Where-Klauseln auftauchen.

    Einen Kommentar schreiben:


  • keks333
    antwortet
    Zitat von AmicaNoctis Beitrag anzeigen
    Mein Lieblingsthema: Negativer left Join
    Code:
     [...]
    (nicht getestet)
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE l ALL 1061 Using where; Using temporary; Using filesort Ändern Löschen
    1 SIMPLE p ALL 291 Using where; Not exists

    funktioniert, ändert aber nix an der abfrage und dauert exact genauso lange. objektiv gesehn is bis jetz die not in abfrage genauso gut bzw schlecht ...
    wo setze ich da am besten den index damits was taugt und endlich nicht ganze 3-4 sekunden zum laden braucht ???

    wäre ein super referenz beispiel.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Mein Lieblingsthema: Negativer left Join
    Code:
    select
    	l.bildid,
    	l.datei,
    	l.owner,
    	rand() as position
    from loungebilder as l
    left join picvotes as p
    	on p.bildid = l.bildid and p.userid = '$u'
    where p.bildid is null
    	and ((l.votes > '10' and l.summe > '16') or l.votes <= '10') 
    	and l.owner != '$u'
    order by position
    limit 1
    (nicht getestet)

    Einen Kommentar schreiben:


  • keks333
    antwortet
    Zitat von combie Beitrag anzeigen
    Wenn es irgend geht, solltest du den Subselect entsorgen und stattdessen einen JOIN verwenden. .
    wollte statt NOT IN , MINUS nehmen wieso geht das nicht?

    und wie mache ich in einem join einen tabellenvergleich in dem eine besteimmte konstelation "ausgeschlossen" wird?

    könnt ihr mir einen ansatz geben ich weiß nich wo ich anfangen soll.
    hab wirklich schon gesucht ohne ende. joins schön und gut aber wie realisier ich das NOT IN darin?

    welche spalten sollte ich den indexieren um den besten erfolg zu bekommen? eine? mehere?
    ich komm mir bissl dumm vor :-(

    Einen Kommentar schreiben:


  • combie
    antwortet
    aber nicht wie man den dann ausliest bzw mit php verarbeitet.
    Tut man ja auch nicht. Wieso auch?
    Ein INDEX beschleunigt das Auslesen, bzw. die Vergleiche im WHERE.

    das EXPLAIN hab ich euch ja geliefert...
    Das Ergebnis des EXPLAIN sollte sich jetzt geändert haben.
    (hoffen wir es mal)

    Wenn es irgend geht, solltest du den Subselect entsorgen und stattdessen einen JOIN verwenden.
    Zuletzt geändert von combie; 23.11.2009, 19:28.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Indizes brauchst du nicht auszulesen oder mit PHP zu verarbeiten. Sie helfen dem DBMS nur, Datensätze schneller zu finden. Du indizierst einfach die richtigen* Spalten und schon geht alles schneller. Das ist alles

    ___
    * die richtigen sind solche, die von Joins mit on oder using benutzt werden oder in Where-Klauseln auftauchen.

    Einen Kommentar schreiben:


  • keks333
    antwortet
    ich gebs auf ich hab schon ewig gesucht jetz.
    ich wollte den subquery mit MINUS beheben was theretisch funktioneiren würde denke ich aber zeigt immer query fehler.

    ich habe gegooglt und den sinn eines indexes vertsanden . steht auch überall wie man einen macht mit sql aber nicht wie man den dann ausliest bzw mit php verarbeitet.

    kann mir jemand helfen und einfach ma ein beipiel geben (aus meiner vorlage)
    subquery raus ( mit joins oder so ka oder mit MINUS? )

    das EXPLAIN hab ich euch ja geliefert...
    wär euch echt dankbar. konkrete beispiele sind echt rar

    beisiele wie [COLOR=#0000ff]CREATE INDEX IDX_CUSTOMER_LAST_NAME on CUSTOMER (Last_Name)[/COLOR]
    sind ja toll aber hilft mir kaum, was mach ich dann mit dem restlichen query bzw dem index? stehe aufm schlauch

    lg
    Zuletzt geändert von keks333; 23.11.2009, 19:26.

    Einen Kommentar schreiben:

Lädt...
X