Sobota duben 11, 2009
"Unbuffered" dotazy
· rubrika Clanky · kategorie PHP
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:
- – 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. - – Použít tzv. „unbuffered“ dotazy, kdy se žádná data nikde neukládají, pomocí funkcí mysql_unbuffered_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:
- nelze zjistit počet vrácených záznamů
- tabulka zůstane blokována, dokud se nepřečtou všechny záznamy
- lze pracovat jen s posledním položeným dotazem
A co se děje když položíme dotaz na MySQL pomocí funkce
mysql_unbuffered_query()? Nedalo mne to a prozkoumal jsem si zdrojové kódy
PHP, kde jsem zjistil že se volá funkce
mysql_use_result()
v případě unbuffered dotazů
jinak při normálních dotazech funkce „mysql_store_result()“: 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
Další komentáře:
Uvozování identifikátorů v SQL dotazech
Optimalizace pro import velkého nmnožství dat do databáze