sql >> Databáze >  >> RDS >> Mysql

MySQL PDO připraveno rychleji než dotaz? To ukazuje tento jednoduchý test

Je třeba zmínit jednu maličkost. Ve výchozím nastavení PDO pouze emuluje připravené příkazy.
A v režimu emulace spouští stejný starý dotaz, aniž by ve skutečnosti připravil jediný příkaz :)

Takže za prvé,

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

zapnout skutečné připravené výpisy.

Je tu ještě jedna maličkost, kterou je třeba zmínit.
Bohužel je jich skutečných velmi málo znalosti ve světě. A to především ve světě Q&A webů. Lidé mají tendenci opakovat informace, které četli a považovali je za rozumné. Bez toho, aby provedli nějaké testy na důkaz, nebo dokonce bez toho, aby na to vztáhli ruce. Takže „často uváděný“ by neměl být vůbec považován za spolehlivý zdroj.

Zpět k věci:i když by měla existovat nějaká pokuta, měla by být většinou bezvýznamná. Pokud ano, musíte svůj systém vyladit.

Každopádně v emulačním režimu to máte jak „rychlé“, tak bezpečné.

Aktualizovat
Po provedení testů na mých datech musím říci, že s vaší databází není něco v pořádku, pokud máte trojnásobný rozdíl na velké datové sadě.

Pro bleskový dotaz

select title from Board where id = 1

výsledky jsou

emulation   on      off
query      0.07    0.130
prepare    0.075   0.145

zatímco pro docela zatěžující dotaz

select title from Board where id > 1

výsledky jsou

emulation   on      off
query      0.96    0.96
prepare    0.96    1.00

Jak tedy vidíme, na velkém souboru dat se rozdíl stává nepozorovatelným.

U bleskového dotazu je určitý rozdíl, ale protože zabere pouze 0,0003 sekundy (pro jeden dotaz) – řekl bych, že je to dokonalý příklad pro slovo „lhostejnost“.

Pro stejné výsledky mezi query()/prepare() - mám jen jeden nápad - PDO používá připravit/provést pro všechny dotazy, i ty bez vazeb.

Nyní k problému s kódováním.

Ano, podivný problém GBK má vliv na PDO pro verze starší 5.3.3. Tyto verze neměly žádný způsob, jak nastavit správné kódování a byly nevyhnutelně zranitelné (v režimu emulace). Ale protože 5.3.3 PDO podporuje nastavení kódování v DSN a nyní je s ním vše v pořádku.
Pro mysqli je třeba použít mysqli_set_charset() právě pro tento účel se stejným (neproniknutelným) výsledkem.

Ve své vlastní třídě, která je založena na mysqli, používám svou vlastní implementaci zástupného symbolu a nepoužívám vůbec žádné připravené příkazy. Ne kvůli výkonu, ale kvůli lepší spolehlivosti.



  1. MySQL:VYBERTE UNIKÁTNÍ HODNOTU

  2. JDBC ve skriptu Google Apps. Výjimka:Výpis zrušený z důvodu vypršení časového limitu nebo požadavku klienta

  3. Jak zálohovat/obnovit MySQL/MariaDB a PostgreSQL pomocí nástrojů „Automysqlbackup“ a „Autopostgresqlbackup“

  4. Proč (a jak) rozdělit sloupec pomocí master..spt_values?