Es gibt eine Kleinigkeit zu erwähnen. Standardmäßig wird PDO nur emulieren vorbereitete Anweisungen.
Und im Emulationsmodus führt es dieselbe alte Abfrage aus, ohne tatsächlich eine einzige Anweisung vorzubereiten :)
Also, zuerst einmal,
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
um echte vorbereitete Anweisungen einzuschalten.
Es gibt noch eine Kleinigkeit zu erwähnen.
Leider gibt es sehr wenige echte Wissen in der Welt. Und besonders in der Welt der Q&A-Sites. Menschen neigen dazu, die Informationen zu wiederholen, die sie gelesen und für angemessen befunden haben. Ohne irgendwelche Beweistests durchzuführen oder sogar ohne Hand anzulegen. Daher sollte "oft erwähnt" überhaupt nicht als zuverlässige Quelle angesehen werden.
Zurück zur Sache:Obwohl es eine Strafe geben sollte, sollte sie die meiste Zeit unbedeutend sein. Wenn dies der Fall ist, müssen Sie Ihr System optimieren.
Wie auch immer, im Emulationsmodus haben Sie es sowohl "schnell" als auch sicher hinbekommen.
Aktualisieren
Nun, nachdem Sie Ihre Tests mit meinen Daten durchgeführt haben, muss ich sagen, dass etwas mit Ihrer Datenbank nicht stimmt, wenn Sie bei einem großen Datensatz eine 3-fache Differenz haben.
Für eine Blitzabfrage
select title from Board where id = 1
Ergebnisse sind
emulation on off
query 0.07 0.130
prepare 0.075 0.145
während für die ziemlich lästige Abfrage
select title from Board where id > 1
Ergebnisse sind
emulation on off
query 0.96 0.96
prepare 0.96 1.00
Wie wir also sehen können, wird der Unterschied bei einem großen Datensatz nicht mehr wahrnehmbar.
Für die Blitzabfrage gibt es einen gewissen Unterschied, aber da sie nur 0,0003 Sekundenbruchteile (für eine einzelne Abfrage) benötigt, würde ich sagen, dass dies ein perfektes Beispiel für das Wort "Gleichgültigkeit" ist.
Für die gleichen Ergebnisse zwischen query()/prepare() - ich habe nur eine Idee - verwendet PDO "prepare/execute" für alle Abfragen, auch für diejenigen ohne Bindungen.
Nun zum Kodierungsproblem.
Ja, seltsames GBK-Problem betrifft PDO für Versionen vor 5.3.3. Diese Versionen hatten keine Möglichkeit, die richtige Codierung einzustellen, und waren (im Emulationsmodus) unvermeidlich anfällig. Aber seit 5.3.3 unterstützt PDO das Setzen von Encoding in DSN, und jetzt ist damit alles in Ordnung.
Für mysqli muss man mysqli_set_charset()
verwenden für genau diesen Zweck mit dem gleichen (undurchdringlichen) Ergebnis.
In meiner eigenen Klasse, die auf mysqli basiert, verwende ich meine eigene Platzhalterimplementierung und verwende überhaupt keine vorbereiteten Anweisungen. Nicht aus Leistungsgründen, sondern für eine bessere Zuverlässigkeit.