Mysql

MySQL 什麼時候開始向客戶端發送數據?

  • January 28, 2019

我正在使用預設配置的 InnoDB 儲存引擎開發 MySQL 5.7。對於不同的場景,我有兩個問題,並且需要了解 MySQL 如何將數據發送到客戶端的內部工作。

場景一:

如果對非常大的數據(比如 1 GB)進行選擇查詢,MySQL 是將整個數據從磁碟(來自.idb文件)拉到InnoDB 緩衝池還是分批向客戶端發送數據而不用盡伺服器記憶體?

場景二:

沒有 ORDER BY 或 GROUP BY 子句的兩個表的簡單內部連接(即數據的順序無關緊要)。在這種情況下,MySQL是在連接數據累積時發送數據(即批量)還是在緩衝池中建構整個JOIN結果並在之後發送數據?整個數據是否載入到記憶體中?

我本機的my.cnf配置如下:

[mysqld]
performance_schema=OFF
innodb_buffer_pool_load_at_startup=OFF
innodb_buffer_pool_dump_at_shutdown=OFF
innodb_buffer_pool_size=4294967296 
secure-file-priv = ""

注意:我在關閉和啟動時禁用了緩衝池載入,以模擬伺服器啟動時沒有數據記憶體的情況。

緩衝池不用於具體化查詢結果。它儲存要在所有連接的會話之間共享的表和索引頁。

每個會話分配自己的結果緩衝區,從緩衝池中複製所選數據。無論是否涉及連接,這都適用。

如果不需要額外的操作,部分結果將在結果緩衝區滿後立即發送給客戶端。如果必須對結果集進行排序,這將在排序緩衝區(以及必要時的臨時表)中完成,那麼排序後的數據將像以前一樣通過結果緩衝區發送到客戶端。

您可以在文件中閱讀更多關於 MySQL 如何使用記憶體的資訊

引用自:https://dba.stackexchange.com/questions/228218