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

Proč uzavíráme výsledek v Mysqli

Vaše kontrola, zda se připojení nezdařilo, spadá do kódu, který používá připojení. Očividně to nebude fungovat, protože to není živé spojení. Ujistěte se, že pokud se připojení nezdaří, není dosaženo kódu, který na něm závisí. (Všimněte si, že nemusím obhajovat použití příkazu exit nebo die. Mohou způsobit poměrně špatnou uživatelskou zkušenost. Mohou být užitečné, ale v ideálním případě byste měli vydat lepší zprávu a nechat ošklivé chybové věci pro protokoly [pokud pouze testuje nebo je to skript příkazového řádku]).

Pokud jde o close() (což je ve skutečnosti alias pro free()):

free() v podstatě uvolňuje všechny věci připojené k výsledku. Musíte pochopit, že existují dva (zjednodušení, ale jděte s tím) způsoby načítání řádků:

Buffered – Vše je staženo jedním tahem. Jinými slovy, ve chvíli, kdy začnete procházet záznamy, jsou všechny ve skutečnosti již v paměti. Jsou uloženy do vyrovnávací paměti . Nejsou stahovány ze serveru pokaždé, když voláte fetch(), ale jsou stahovány z paměti.

Bez vyrovnávací paměti – může existovat malá vyrovnávací paměť, ale v podstatě pokaždé, když zavoláte fetch(), musí PHP stáhnout nový řádek z databáze. Na začátku smyčky nesedí všichni v paměti.

Zajímavá poznámka:num_rows() lze volat na dotaz ve vyrovnávací paměti velmi efektivně, protože všechny řádky jsou již vytaženy (ačkoli byste nikdy neměli stahovat všechny řádky jen proto, abyste je spočítali – k tomu slouží COUNT). Dotazy bez vyrovnávací paměti nemohou provádět num_rows(), dokud nevytáhnou všechny řádky. To znamená, že to bude buď chyba, nebo to v podstatě změní na dotaz ve vyrovnávací paměti.

Každopádně zpět k vaší aktuální otázce:

free() uvolní vše, co souvisí s výsledným objektem. V případě dotazu s vyrovnávací pamětí se jedná o všechny řádky uložené v paměti. V případě dotazu bez vyrovnávací paměti funkce free() uvolní všechny řádky, které mohou být uloženy v paměti, a poté zruší zbytek požadavku. V podstatě to PHP říká MySQL:"Hej, znáte všechny ty řádky, které požaduji? Rozmyslel jsem si to. Můžete ten požadavek jednoduše zahodit."

Pokud byste měli uvolnit výsledky... Kdykoli proměnná překročí rozsah*, stane se to tak jako tak. Není však na škodu to udělat explicitně a v situacích, kdy dotaz může spotřebovat hodně paměti a další dotaz po něm může spotřebovat hodně paměti, možná budete chtít sady uvolnit, aby bylo využití paměti nízké. .

* Nebo možná až žádost skončí. Z hlavy si to nepamatuji.




  1. Zaznamenejte varování do tabulky

  2. vyberte agregační funkci a všechny ostatní sloupce

  3. porovnejte dvě hodnoty oddělené čárkami v mysql

  4. Mohu spustit jakýkoli program mimo mysql prostřednictvím spouštěčů mysql?