Mysql

選擇大於緩衝池大小的數據

  • November 24, 2016

想像一下,我們有一個有 1 億行和 80 GB 大小的表。

每行都有文本列和乘以整數列。

我們將 Innodb_buffer_pool_size 設置為 40G

我執行這個查詢:

select text,id,like_count from example where time > 'xxx-xx-xx' and time < 'xxx-xx-xx'

所以如果這個查詢需要讀取50G的數據文件(因為查詢)並移動到緩衝池。我想知道緩衝池如何處理這些數據。

因為我們將緩衝池設置為 40G 但查詢需要 50G 來處理它。

您的場景聽起來與 mysqldump 將做的完全一樣:將每個數據和索引頁面從 InnoDB 緩衝池中推出。您可以看到情況確實如此,因為當 mysqldump 正在進行時,程序列表將具有類似SELECT /*!N SQL_NO_CACHE */ from .... 請參閱 MySQL 慢查詢日誌中的 mysqldump 中出現 SELECT 的範例- SELECT /*!N SQL_NO_CACHE */

任何全表掃描都會將表中的每個數據頁推送到緩衝池中,從而導致緩衝池中的每個舊頁都被逐出,這是有道理的。如果將 50G 的數據頁推入 40GB 緩衝池,則緩衝池將包含該表的最後 80%,因為前 20% 將被推入緩衝池,然後被推出。我大約 4 個月前提到過(請參閱我的舊文章Is it safe to run parallel innodb single-transaction dumps of individual tables?

建議

如果您的目標是在大查詢之前和之後保持 Buffer Pool 的內容看起來相同,那麼您只能做一件事:將 Buffer Pool 的映射轉儲到磁碟,執行您的大查詢,然後從地圖。

mysql> SET GLOBAL innodb_buffer_pool_dump_now = 1;
mysql> ( Your Big 50GB query )
mysql> SET GLOBAL innodb_buffer_pool_load_now = 1;

請參閱有關這些選項的 MySQL 文件

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