pdo的query方法查詢為什麼這麼耗記憶體

來源:互聯網
上載者:User
$rs = $pdo->query('select * from tb_user');echo convert(memory_get_usage());die;

tb_user表2G的話,記憶體開銷也要2G多,難道query返回的不是一個遊標嗎?

回複內容:

$rs = $pdo->query('select * from tb_user');echo convert(memory_get_usage());die;

tb_user表2G的話,記憶體開銷也要2G多,難道query返回的不是一個遊標嗎?

http://stackoverflow.com/questions/6895098/pdo-mysql-memory-consumption-with-large-result-set
建議讀一下這篇文章
似乎pdo沒你想那麼聰明
我感覺最後那個回答 手動分頁返回更靠譜一些

PHP+MySQL緩衝查詢和無緩衝查詢
http://php.net/manual/zh/mysqlinfo.concepts.buffering.php
http://php.net/manual/zh/mysqli.query.php
PHP MySQL查詢(mysqli,pdo_mysql)預設使用緩衝模式.
也就是說查詢結果將一次性從MySQL傳輸到PHP進程記憶體中,
這時可以統計結果集的行數,以及移動結果集指標.
緩衝模式下,如果結果集很大,那麼PHP進程也會佔用大量的記憶體,
直到結果集被unset或者free.
store_result也用於緩衝模式,所有結果一次性儲存到PHP進程中:
mysqli::store_result
mysqli_stmt::store_result
如果PHP的MySQL資料庫驅動底層用的是libmysqlclient,那麼memory_limit不能統計到結果集佔用的記憶體,
除非結果集已經賦值給PHP變數,如果底層使用mysqlnd作為驅動時則可以統計到(PHP從5.4開始預設底層預設使用mysqlnd).
無緩衝模式下執行的查詢將會返回一個resource資源引用,位於MySQL查詢結果等待PHP擷取.
無緩衝模式下,PHP進程佔用的記憶體很少,但會增大MySQL伺服器的負載.
在PHP取回所有結果前,在當前資料庫連接下不能發送其他的查詢請求.
無緩衝查詢簡稱use_result.
總結:
當結果集不大時,或者需要在讀取所有行前擷取結果集行數時,使用緩衝查詢(預設).
當結果集很大時,使用無緩衝查詢,避免PHP進程佔用大量的記憶體.

$rs = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT);$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.