Name: Marc Geschlecht: Anmeldedatum: 28.08.2004 Beiträge: 52421 Wohnort: Lohmar
Meine eBay-Auktionen:
09.10.2009, 22:42
zitieren
Hallo,
ich habe mir mal die Mühe gemacht und die verschiedensten Varianten, wie man eine Abfrage gestalten könnte, in einen Benchmark gepackt und ausgewertet.
Daten: PHP Version 5.2.9-1nmm1 MySQL Version 5.0.51a AMD Phenom QuadCore 8 GB Arbeitsspeicher 750 GB Festplatte SATA Hardware-RAID 1
Die DB wurde einmal pro Seitenimpression konnektiert, die Abfrage 50 mal durch eine Schleife gejagt und das ganze 100x wiederholt. Die Zeit ist dann der Schnitt aus allen 100 Versuchen.
Fazit: Die Vorteile von Prepared Statements konnte ich in diesem Fall nicht ermitteln. Im Gegenteil, selbst wenn man sie außerhalb des Loops vorbereitete und im Loop dann nur noch den WHERE-Teil und die Ausführung durchläuft, ändert das nichts großartig am Ergebnis.
PS soll man wenn aber sowieso nur einsetzen, wenn man eine Schleife mit INSERTs oder ähnliches hat. Bei SELECTs sollte es denke ich eher kaum dazu kommen, da man dort immer noch mit IN() oder INNER SELECTs arbeiten kann.
Der Unterschied zwischen mysql und mysqli ist praktisch nicht mehr messbar. Allerdings sollte man in jedem Fall mysqli vorziehen, da diese Datenbankverwaltung die einzige ist, die durch PHP noch weiterentwickelt wird und sie unterstützt auch weit aus mehr Funktionen.
In Sachen Performance erkennt man schnell, dass man soweit es möglich ist, den Cache von SQL aktivieren sollte. Weiterhin sollte man mit der Option MYSQLI_USE_RESULT arbeiten, um den Buffer von MySQL zu unterdrücken. Dabei ist allerdings die Erklärung von MySQL zu dem Thema zu beachten: http://dev.mysql.com/doc/refman/5.1/de/mysql-use-result.html
Die wichtigsten Passagen dazu:
D.h. wenn man z.B. Daten aus der DB ausliest und dann nachträglich das Template füttert und die Daten aber vorher noch mal durch diverse Funktionen jagt. Solange diese Schleife nämlich läuft, kann kein anderer auf die Tabelle zugreifen. Allerdings gilt das wohl "nur" für MyISAM. In InnoDB sollte das angeblich keine Auswirkungen haben und man kann es wohl immer einsetzen.
Ansonsten ist diese Passage denke ich logisch:
Da man direkt ausliest, ohne erstmal MySQL das Ergebnis vorbereiten zu lassen, wird man natürlich nicht erfahren, wie viele Reihen das Ergebnis z.B. umfasst, außer man hat es schon durchlaufen.
Pauschal kann man sagen, dass der Cache sich immer da lohnt, wo die Datenbank mehr SELECTs als UPDATEs/INSERTs hat, da nach jeder Aktualisierung der Cache erneuert wird, ist die dann folgende Abfrage zwar langsamer, allerdings ist der 2., 3., 4., etc. dann wiederrum schneller, so dass der Vorteil mit dem Verhältnis zwischen SELECT und UPDATE/INSERT proportional ansteigt.
Wenn Dir die Beiträge zum Thread "Benchmark: mysql, mysqli - Buffer, Cache und Prepared Stmt" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:
Registrierte Mitglieder genießen die folgenden Vorteile: ✔ kostenlose Mitgliedschaft ✔ keine Werbung ✔ direkter Austausch mit Gleichgesinnten ✔ neue Fragen stellen oder Diskussionen starten ✔ schnelle Hilfe bei Problemen ✔ Bilder und Videos hochladen ✔ und vieles mehr...
Einfaches Skript um MySQl zu benchmarken:
<?php
$link = mysqli_connect("localhost", "root", "");
/* check connection */
if (mysqli_connect_errno())...
Hi,
hier die Resultate:
/*
// version 1
// 1. run 0.14501937151
// 2. run 0.145541801453
// 3. run 0.141622686386
// fastest run 0.0934751033783
while ($field = $meta->fetch_field()) {
$row[] =...
Manche nutzen include() um MySQL Caches einzubinden. D.h. erst werden die Daten mit SELECT aus der MySQL Datenbank ausgelesen, mit var_export() aufbereitet und dann in eine Datei geschrieben. Diese kann man dann sehr performant per include()...
Das geht ganz einfach. Hier ein Beispiel:
<?php
// ab hier html kopf, menü, usw., eben alles was nicht in den cache soll, weil es sich z.b. ändert, wenn sich jemand einloggt
?>
<html>
<head>
</head>
<body>
<div...
Wollte mal gucken was eure PC´s so hergeben
mein pc system:
Asus Crosshair
ATI 2900 GT
Kingstone HyperX DDR1066 2GB standart SPD mit CL 5 xD
und kleiner rein
hier mal nen 3Dmark03 run mit meiner neuen CPU davor AMD X2 BE 2300 ca 21000...
Hi,
von meiner neuen Platte hab ich mal ein Benchmark gemacht:
HD Tune Pro: INTEL SSDSA2M160G2GC Benchmark
Test capacity: full
Read transfer rate
Transfer Rate Minimum : 128.2 MB/s
Transfer Rate Maximum : 198.2 MB/s
Transfer Rate...
Danach hatte ich eigentlich gesucht und bin auf etwas vergleichbares gestoßen:
http://benchmark.nophia.de/benchmarks-textverarbeitung-k-2-texte-mit-mindestens-zwei-vokalen-b-21.html
Dazu hätte ich direkt einen Verbesserungsvorschlag:
<?PHP
...