亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mysqli_result 是否需要活動連接來查找結果?

mysqli_result 是否需要活動連接來查找結果?

PHP
手掌心 2023-07-08 22:13:43
我們注意到,對 API 端點的調用通常有多個重復的 MySQL 語句查詢SELECT(有時是數百個)。因此,我們決定創建一個哈希圖來存儲 mysqli_result并檢查給定的查詢是否已經完成并返回保存在地圖中的結果。我的問題是:是否mysqli_result維護對我們連接的引用?這實際上會幫助我們避免數據庫因已經不必要地請求的查詢而超載嗎?如果mysqli_result太大,我們的進程的內存是否會溢出fpm?我基本上想知道什么方法更好:對于查詢 A,mysqli_result每次需要時重用對象;每次需要時重做查詢 A。
查看完整描述

1 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

mysqli_result()mysqli從 MySQL 獲取結果后,既不需要連接到 MySQL,也不需要對象。


注意:以上內容僅適用于緩沖查詢。如果您使用無緩沖的結果集,則mysqli_result需要打開 mysqli 連接來獲取數據,否則您將收到一條錯誤消息:


PHP 警告:mysqli_result::fetch_all():讀取行時出錯...


但是,只有在使用無緩沖查詢時關閉連接時,才會出現此錯誤消息。例如


$res = $mysqli->query('SELECT id FROM Users LIMIT 1', MYSQLI_USE_RESULT);

$mysqli->close();

$res->fetch_all();

盡管mysqli_result在創建它的實例時需要有效的連接,但它只需要該連接來獲取數據。中的第二個參數用于mysqli_result::__construct()決定結果集是應該在 PHP 中緩沖還是存儲在 MySQL 服務器上并逐行獲取。當您創建 的實例時,mysqli_result需要將 的實例mysqli作為第一個參數傳遞。


// Execute query on MySQL server

$res = $mysqli->real_query('SELECT id FROM Users LIMIT 1');

// Create the result object.?

// The second argument can be MYSQLI_STORE_RESULT for buffered result or MYSQLI_USE_RESULT for unbuffered.

$res = new mysqli_result($mysqli, MYSQLI_STORE_RESULT);


// If MYSQLI_STORE_RESULT was used then you can close mysqli here.

unset($mysqli); // or $mysqli->close(); or both

$data = $res->fetch_all();


// If MYSQLI_USE_RESULT was used then you can't close mysqli yet.

// unset($mysqli);

$data = $res->fetch_all();

SQL 查詢的緩沖是一項相當復雜的任務,最好避免重復調用,而不是實現緩存。SELECT嘗試重構您的代碼,以便在腳本執行期間不會多次調用相同的查詢。

還有一個預制的解決方案,盡管不是很受歡迎。Mysqlnd查詢結果緩存插件

一如既往地記?。?/p>

過早的優化是萬惡之源


查看完整回答
反對 回復 2023-07-08
  • 1 回答
  • 0 關注
  • 111 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號