Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/blue-team.org/bcblog/textpattern/lib/txplib_db.php on line 14 Bc. BLOG: "Unbuffered" dotazy

Sobota duben 11, 2009

"Unbuffered" dotazy

· rubrika Clanky · kategorie

Možná víte, možná nevíte, ale pokud programujete v PHP a položíte nějaký dotaz na databázi, který vrací výsledky, pomocí klasických funkcí mysql_query, pg_query atd., tak PHP čeká na všechny data od databáze, ty si uloží v paměti a teprve následně pak s nima může programátor pracovat. Při malém množství vrácených záznamů nám toto vadit nebude, ale co když budeme například exportovat tabulku s milióny záznamů? Brzo by došla pamět procesu (ne paměť přidělená PHP skriptu).
Toto by se dalo vyřešit dvěma způsoby:

  1. – Prvním dotazem si zjistit kolik nám bude vráceno záznamů a pak v cyklu číst vždy pouhých xxx záznamů, ty následně zpracovat (samozřejmě také uvolnit použité zdroje ) a pak dalším dotazem si říct o další, dokud je nepřečteme všechny.
  2. – Použít tzv. „unbuffered“ dotazy, kdy se žádná data nikde neukládají, pomocí funkcí mysql_unbuffe­red_query, …

Druhý zmiňovaný způsob lze ovšem použít pouze pro databáze MySQL, SQLite a Sybase a má několik nevýhod:

A co se děje když položíme dotaz na MySQL pomocí funkce mysql_unbuffe­red_query()? Nedalo mne to a prozkoumal jsem si zdrojové kódy PHP, kde jsem zjistil že se volá funkce
mysql_use_resul­t() v případě unbuffered dotazů
jinak při normálních dotazech funkce „mysql_store_re­sult()“: http://dev.mysql.com/…-result.html (funkce jsou z MySQL API pro C).
Rozdíl je v tom, že při volání mysql_use_result() si databáze alokuje paměť nutnou pro přečtení jednoho záznamu a
ten pošle klientovi a po zavolání funkce mysql_fetch_row() (opět MySQL API pro C) databáze přečte další řádek a ten pošle klientovi atd. dokud se nepřečtou všechny záznamy. V opačném případě se čte více dat a jak jsem již psal PHP si nejdříve vše uloží do paměti a pak stím umožní pracovat 

13:54 — Zobrazeno: 506x — Stálý odkaz



Komentáře

Přidání komentáře
Formát Texy

Váš příspěvek by měl být psán srozumitelně a k danému tématu! Nepoužívejte hrubé nadávky, vulgarismy, atd. a před samotným odesláním příspěvku si ho prosím ještě zkontrolujte!

Tučně zvýrazněné položky je nutno vyplnit!

Další komentáře:

XHTML 1.0 Strict - CSS