php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.03.2006, 18:31  
Benutzer
 
Registriert seit: 23.07.2004
Beiträge: 59
mrSpok
Standard SELECT WHERE datetime abfrage - Optimierung

hallo forum,

seit einiger zeit bin ich auf der suche nach optimierungen von 'WHERE datetime-feld' abfragen. leider habe ich bis jetzt noch keine lösung gefunden - aber vielleicht könnt ihr mir weiterhelfen.

vorab: ich bin nicht der administator der datenbank und kann somit nicht ins design eingreifen...

also die abfrage lautet in etwa wiefolgt:

Code:
SELECT meinPrimaryKey FROM tabelle WHERE LetzteAenderung>=$StartDateTime
problem ist leider die grösse dieser tabelle (>5mio zeilen) - eine solche abfrage dauert ca. 2000sek

kenn jemand eine möglichkeit solche abfragen performanter zu gestalten - also beispielsweise mit php nachzubearbeiten?

danke schonmal im voraus!
mrSpok ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.03.2006, 18:36  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

- ein LIMIT ist immer sehr hilfreich, wenn du maximal X oder genau Y Ergebnisse brauchst
- du kannst die Spalten ruhig auch selektieren wenn du sie überhaupt brauchst, denn die Zeile hast du ja sowieso schon getroffen
Zergling-new ist offline   Mit Zitat antworten
Alt 15.03.2006, 18:37  
Gast
 
Beiträge: n/a
Standard

LetzteAenderung ist vom Typ Datetime?
Was genau enthält $StartDateTime der Form nach?
  Mit Zitat antworten
Alt 15.03.2006, 18:46  
Benutzer
 
Registriert seit: 23.07.2004
Beiträge: 59
mrSpok
Standard

hi zergling,

danke für die schnelle antwort!

Zitat:
Zitat von Zergling
- ein LIMIT ist immer sehr hilfreich, wenn du maximal X oder genau Y Ergebnisse brauchst
das ergebnis beinhaltet durchschnitlich 1000 zeilen.
hm.. müsste ich mal checken!
also mache zuerst ein MAX(meinPrimaryKey), packe die abfrage in eine schleife welche zusätzlich ein ' AND meinPrimaryKey>$x AND meinPrimaryKey<$y' beinhaltet. um dies danach wieder mit php in ein einzelnes array zu schreiben? das wäre sicher ein versuch wert!

Zitat:
Zitat von Zergling
- du kannst die Spalten ruhig auch selektieren wenn du sie überhaupt brauchst, denn die Zeile hast du ja sowieso schon getroffen
das verstehe ich nun nicht ganz? meinst du zusätzliche spalte? die brauch ich nicht... ja, ich weiss - komische abfrage - dahinter steckt aber ein monitoring....

danke!
mrSpok ist offline   Mit Zitat antworten
Alt 15.03.2006, 18:48  
Benutzer
 
Registriert seit: 23.07.2004
Beiträge: 59
mrSpok
Standard

Zitat:
Zitat von Bruchpilot
LetzteAenderung ist vom Typ Datetime?
Was genau enthält $StartDateTime der Form nach?
$StartDateTime enthält ein datetime wert :wink:

also zb: '2006-03-14 11:00:54'

grz
mrSpok ist offline   Mit Zitat antworten
Alt 15.03.2006, 18:54  
Gast
 
Beiträge: n/a
Standard

Dann auf jeden Fall einen Index über LetzteAenderung erstellen.

Zitat:
also mache zuerst ein MAX(meinPrimaryKey), packe die abfrage in eine schleife welche zusätzlich ein ' AND meinPrimaryKey>$x AND meinPrimaryKey<$y' beinhaltet.
Was Du da mit $x und $y machen willst, klingt mindestens seltsam, eher falsch, wahrscheinlich sehr falsch.
Von Zergling gemeint war eine Abfrage der Form
SELECT ... FROM ... WHERE ... ORDER ... LIMIT x,y - sofern auf das Problem anwendbar.
Spätestens beim Wort "Schleife" ist in 99 von 100 Fällen ein Fehler im Datenbankzugriff oder -design anzunehmen.
  Mit Zitat antworten
Alt 15.03.2006, 19:11  
Benutzer
 
Registriert seit: 23.07.2004
Beiträge: 59
mrSpok
Standard

Zitat:
Zitat von Bruchpilot
Dann auf jeden Fall einen Index über LetzteAenderung erstellen.
LetzteAenderung ist leider auch teilweise NULL - vorallem aber fehlen mir die nötigen rechte sowas zu ändern...

Zitat:
Zitat von Bruchpilot
Was Du da mit $x und $y machen willst, klingt mindestens seltsam, eher falsch, wahrscheinlich sehr falsch.
Von Zergling gemeint war eine Abfrage der Form
SELECT ... FROM ... WHERE ... ORDER ... LIMIT x,y - sofern auf das Problem anwendbar.
ja, aber limit bringt doch bei solch einer abfrage nichts - limit wird doch auf das ergebnis angewendet? oder?

Zitat:
Zitat von Bruchpilot
Spätestens beim Wort "Schleife" ist in 99 von 100 Fällen ein Fehler im Datenbankzugriff oder -design anzunehmen.
das verstehe ich nun nicht ganz?
diese datenbank wurde für den zweck designed, für welchen sie auch eingesetzt wird. ich versuche das ganze zu monitoren.. evtl. müsste ich wohl doch mal mit dem admin sprechen...:wink:
aber vergesst nicht - wir sprechen hier von >5mio zeilen - nach meiner erfahrung ist es in dieser dimension effizienter 500'000 abfragen zu starten als eine einzelne.
mrSpok ist offline   Mit Zitat antworten
Alt 15.03.2006, 19:41  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von mrSpok
LetzteAenderung ist leider auch teilweise NULL - vorallem aber fehlen mir die nötigen rechte sowas zu ändern...
teilweise NULL Werte stören mysql nicht beim Indizieren. Die notwendigen Rechte sind da schon eher ein Problem. Ja, Admin fragen. Der Platzbedarf ist sicherlich ewiglangen Anfrage-Bearbeitungen vorzuziehen. Wenn es ein ausgewiesener DB-Admin ist, sollte er eh früher oder später auf Dich zukommen wegen des fehlenden Index, wenn Du den Server damit 2000 Sekunden beschäftigen kannst.
Zitat:
Zitat von mrSpok
ja, aber limit bringt doch bei solch einer abfrage nichts - limit wird doch auf das ergebnis angewendet? oder?
Deshalb das: sofern auf das Problem anwendbar.

Zitat:
Zitat von mrSpok
diese datenbank wurde für den zweck designed, für welchen sie auch eingesetzt wird.
Habe ich nie bezweifelt.
Zitat:
Zitat von Bruchpilot
Spätestens beim Wort "Schleife" ist in 99 von 100 Fällen ein Fehler im Datenbankzugriff oder -design anzunehmen.
Wenn das Design stimmt, greift vielleicht der erste Teil der Aussage? Abfrage-Schleifen sollen vermieden werden. Jede Abfrage kostet Extra-Zeit. Meistens ist auch die zusammengestoppelte Abfrage komplexer in der Abarbeitung als die eigentlich richtige Abfrage.
Sollte eine Schleife tatsächlich unvermeidbar sein, kann das Datenbankdesign (und sei es auch nur für diese eine Aufgabe) ungeeignet sein. Ist das Datenbankdesign nicht zu verbessern, liegt der 1 von 100 Fällen vor. So einfach ist das.

Zitat:
aber vergesst nicht - wir sprechen hier von >5mio zeilen - nach meiner erfahrung ist es in dieser dimension effizienter 500'000 abfragen zu starten als eine einzelne.
Das ist entweder schon lange her oder das Datenbanksystem (oder die Hardware?) taugt nichts oder es wurde sub-optimal genutzt - zB durch fehlende Indizes, unnötige Typkonvertierung bei Vergleichen, fehlerhaften WHERE/ON-Bedingungen oder oder oder.
Wenn Du durch einen einzelnen, einfachen Datumvergleich aus 5 Millionen Datensätzen 1000 auswählst, dann ist das keine schlimme Aufgabe für eine Mysql Datenbank.
  Mit Zitat antworten
Alt 15.03.2006, 19:48  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Du kannst das Ergebnis ja eventuell auch cachen, also jede Nacht generieren lassen und nur auf diese Werte zugreifen.
Zergling-new ist offline   Mit Zitat antworten
Alt 16.03.2006, 09:09  
Benutzer
 
Registriert seit: 23.07.2004
Beiträge: 59
mrSpok
Standard

guten morgen..
Zitat:
Zitat von Bruchpilot
Zitat:
Zitat von mrSpok
LetzteAenderung ist leider auch teilweise NULL - vorallem aber fehlen mir die nötigen rechte sowas zu ändern...
teilweise NULL Werte stören mysql nicht beim Indizieren. Die notwendigen Rechte sind da schon eher ein Problem. Ja, Admin fragen. Der Platzbedarf ist sicherlich ewiglangen Anfrage-Bearbeitungen vorzuziehen. Wenn es ein ausgewiesener DB-Admin ist, sollte er eh früher oder später auf Dich zukommen wegen des fehlenden Index, wenn Du den Server damit 2000 Sekunden beschäftigen kannst.
stimmt - denk ich auch!



Zitat:
Zitat von Bruchpilot
Das ist entweder schon lange her oder das Datenbanksystem (oder die Hardware?) taugt nichts oder es wurde sub-optimal genutzt - zB durch fehlende Indizes, unnötige Typkonvertierung bei Vergleichen, fehlerhaften WHERE/ON-Bedingungen oder oder oder.
Wenn Du durch einen einzelnen, einfachen Datumvergleich aus 5 Millionen Datensätzen 1000 auswählst, dann ist das keine schlimme Aufgabe für eine Mysql Datenbank.
nun dies ist ein mysql-replication-server - und hardwaremässig nicht gerade optimal bestückt.. aus diesem grunde auch das problem mit grösseren abfragen - 1gb ram reichen nicht aus... bei dieser abfrage beginnt der server zu swappen.... das hardware-upgrade hat also höchste prio!

die abfrage selbst ist dieselbe, mal abgesehen von den den feld und tabellennamen, ich benötige nur den primary-key...

bezüglich schleifen:
ich habe nun kurz einen test gemacht mit einem hochzählenden 'limit' von 5000 Zeilen - Dauer: 6367.34721 sek (inklusive array auslesen, gruppieren) - schade! nur einen vorteil sehe ich - die Tabelle ist nicht wirklich lange 'locked', dies bleibt also eher unbemerkt! nachteil - diese abfrage sollte mal stündlich ausgeführt werden - passt so nicht rein...

Zitat:
Zitat von Zergling
Du kannst das Ergebnis ja eventuell auch cachen, also jede Nacht generieren lassen und nur auf diese Werte zugreifen.
Wenn ich dich richtig verstanden habe, mache ich dies bereits. Die abfrage wird ein einem Script weiterverarbeitet und in eine andere Datenbank geschrieben. Diese Abfrage sollte aber eigentlich jede Stunde durchgeführt werden... und da ist es schlecht, wenn die Tabelle jedesmal für 30 min Locked ist.

Eine kleine Optimierung habe ich inzwischen gefunden!
Code:
SELECT meinPrimaryKey FROM tabelle WHERE LetzteAenderung BETWEEN $StartDateTime AND NOW();
ist ca. 200 sekunden schneller :wink:


btw: Langsam frag ich mich ob ich nicht sauberer ist auf die Binlogs des Replicant zugreife um diese mehr oder weniger Realtime weiter zu verarbeiten...

danke für eure hilfe! ich werde bald mal alle unnötigen dienste stoppen um etwas speicher freizugeben und die abfragen nochmal laufen lassen - mal sehen!
grz
mrSpok ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Where Abfrage durchsuchen $$$ ThiKool $$$ Datenbanken 3 12.09.2007 16:42
erweiterte abfrage - where DarkManX Datenbanken 2 02.02.2007 17:14
where abfrage liefert zu viele ergebnisse phpdummi Datenbanken 9 22.01.2007 22:54
Mehrfach where in der ABfrage? Kori Datenbanken 4 16.01.2007 16:46
SELECT ... WHERE ... Nur ein User! Mike² Datenbanken 1 30.09.2006 19:15
Mehrere Werte in WHERE abfrage McNet Datenbanken 6 23.04.2006 02:06
[Erledigt] select where TIME Datenbanken 7 17.02.2006 12:40
Im Select eine IFF Abfrage bendigo Datenbanken 4 21.11.2005 14:11
Select * FROM * WHERE ??? PHP Tipps 2005-2 12 07.10.2005 17:45
where -x- in (select...) klappt nicht Unbekanntes_Pferd Datenbanken 3 16.07.2005 14:36
SELECT Abfrage.... seh den wald nich... center Datenbanken 8 01.06.2005 14:32
Befehlsoptimierung faux Datenbanken 4 31.05.2005 19:11
SELECT FROM DB WHERE 2 SACHEN UEBEREINSTIMMEN Datenbanken 3 24.01.2005 15:58
[Erledigt] [gelöst] MySQL abfrage eingrenzen anhand einer SELECT Auswah Datenbanken 13 01.12.2004 18:42
Select abfrage in Schleife PHP Tipps 2004 2 20.07.2004 15:37

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
where datetime, select datetime, mysql select datetime, select where datetime, datetime where, mysql datetime select, mysql index datetime, mysql datetime index, datetime select, where datetime >, mysql select where datetime, where datetime <, mysql datetime abfrage, php select datetime, where datetime =, datetime abfrage, select date time, mysql abfrage datetime >, select datetime where, php mysql select datetime

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.