PGB wrote:XAMPP 32 Bit
(Ich vermute das hier schon das Problem liegt allerdings hab ich keine XAMPP 64 Bit Version gefunden
)
Es gibt kein 64Bit Xampp, weil es keinen 64Bit Apache gibt und auch keinen 64Bit PHP Interpreter.
Es gibt allerdings MySQL als 64Bit Version, Du könntest es ja damit versuchen anstatt mit Xampp.
Allerdings hat 64Bit vs. 32Bit
überhaupt nichts damit zu tun, ob ein Prozess auf eine oder mehrere CPUs aufgeteilt wird. Das ist eine Frage, wie das Programm compiliert wurde, ob es überhaupt in der Lage ist, aufgeteilt zu werden.
PGB wrote:DB mit 2500000 Einträgen und eine recht komplizierte Querry die eine Auswahl aus der DB machen soll
Hoffe ihr habt einen gute Rat wie ich die ganze Abfrage n bisschen schneller bekomme.
Ich denke, dass das Problem ist. Selbst wenn man den Prozess aufteilen könnte, wäre die Performance nicht unbedingt schneller. Dafür spricht auch die Tatsache, dass die CPU nur zu 25% ausgelastet ist - sie langweilt sich. Wahrscheinlich werden einfach sehr viele Daten benötigt, um den Query zu erfüllen, und I/O ist immer ein Bottleneck.
Das meiste Optimierungspotential steckt fast immer im Datendesign und Datenbankdesign. Dazu kann ich aber leider gar nichts sagen, weil wir es nicht kennen. Ein häufiger Fehler (den ich hier aber nicht vermute, weil die Zugrifsszeit dann wahrscheinlich noch dramatisch schlechter wäre) ist das Fehlen von Indexes, oder die ungeschickte Wahl von Indexes. Ein zweiter sehr verbreiteter Fehler ist das Erzeugen zu großer Fundstellen. Dazu ein simples Beispiel:
SELECT * FROM table Where ...
Hier werden alle Spalten selektiert, was bei großen Treffermengen eine sehr große Fundstelle bedeutet. Alle Daten, die die WHERE Bedingung erfüllen, werden in eine temporäre Tabelle geschrieben, die anschließen mit Fetch abgearbeitet werden kann. Stattdessen kann man in Scriptsprachen wie PHP auch so programmieren:
SELECT id FROM table WHERE ...
Wobei id der Primärschlüssel ist. Anschließend programmiert man einen Loop über die Fundstelle (wo nur Schlüssel drin stehen) und holt sich zu jedem Treffer den ganzen Datensatz:
SELECT * FROM Table WHERE id = ....
Und anschließend werden zu diesem SELECT die Daten (eine einzige Zeile) gefetched. Das resultiert zwar in sehr vielen SELECTs (nämlich pro Treffer jeweils einen weiteren SELECT), ist aber in der Performance um FAKTOREN(!) schneller als der erste SELECT, weil der eine riesige Fundstelle erzeugt, deren Aufbau enorm viele Ressourcen verbrät. Dennoch programmieren (leider) die meisten Anwender auf die erste Weise.
Letztendlich sei angemerkt, dass ich nur aus Faulheit "SELECT *" hier geschrieben habe - in echten Programmen hat ein "SELECT *" nichts verloren! Da gehören nur die Spaltennamen selektiert, die man wirklich braucht.