成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL數據查詢太多會OOM嗎?

數據庫 MySQL
內存中的數據頁在Buffer Pool (后文簡稱為BP)管理,BP能夠加速查詢。由于WAL機制,當事務提交時,磁盤上的數據頁是舊的,若這時立即就有個查詢請求讀該數據頁,是不是得立即將redo log應用到數據頁呢?

線上 MySQL 直接 Select 千萬條的100G數據,服務器會裂開嗎?

假設對某100G表t執行全表掃描,把掃描結果保存在客戶端:

 # 該語句無任何判斷條件,所以全表掃描,查到的每行都可直接放到結果集,然后返給客戶端
mysql -h$host -P$port -u$user -p$pwd -e
"select * from t" > $target_file

1 那這“結果集”存在哪?

實際上MySQL讀取、發送數據流程的如下:

  • 獲取一行,寫到net_buffer。該內存大小由參數net_buffer_length定義,默認16k

  1. 繼續獲取行,直到寫滿net_buffer,發出去!
  2. 若發送成功,則清空net_buffer,繼續讀取下一行,并寫入net_buffer
  3. 若發送返回EAGAIN或WSAEWOULDBLOCK,表示本地網絡棧(socket send buffer)寫滿,進入等待。直到網絡棧重新可寫,再繼續發送

以上過程執行流程圖如下:

可以看出一個查詢在發送過程中:占用MySQL內部的內存最大就是net_buffer_length,根本達不到100G。同理socket send buffer 也達不到,若socket send buffer被寫滿,就會暫停讀數據。

所以MySQL是邊讀取邊發送,若客戶端接收得比較慢,會導致MySQL Server由于結果發不出去,該事務的執行時間就會變得很長。

經過分析,我們現在知道了,查詢結果是分段發給客戶端的,因此掃描全表,即使查詢返回大量數據,也不會把內存搞滿。

以上都是Server層的處理邏輯,InnoDB引擎層又是如何處理的呢?

2 InnoDB如何處理全表掃描?

內存中的數據頁在Buffer Pool (后文簡稱為BP)管理,BP能夠加速查詢。由于WAL機制,當事務提交時,磁盤上的數據頁是舊的,若這時立即就有個查詢請求讀該數據頁,是不是得立即將redo log應用到數據頁呢?并不!因為此時,內存數據頁的結果就是最新的,直接讀內存頁即可,所以速度就很快啊,Buffer Pool在此就加速了查詢。

但其實BP對查詢的加速效果依賴于內存命中率??墒褂萌缦旅畈榭串斍癇P命中率

show engine innodb status

一般穩定服務的線上系統,要保證響應性能,內存命中率得在99%以上。

InnoDB Buffer Pool的大小由參數innodb_buffer_pool_size 確定,推薦設成可用物理內存的60%~80%。

3 InnoDB內存管理

使用最近最少使用 (Least Recently Used,LRU)算法,淘汰最久未使用的數據。若此時做個全表掃描,會咋樣?若要掃描一個200G的表,而這個表是一個歷史數據表,平時沒有業務訪問它。按此算法掃描,就會把當前BP里的數據全部淘汰,存入掃描過程中訪問到的數據頁的內容。即BP里主要放的是這個歷史數據表數據。

對于一個正在做業務服務的庫,這可不行呀。你會看到,BP內存命中率急劇下降,磁盤壓力增加,SQL語句響應變慢。所以,InnoDB不能直接使用原生LRU。

改良版LRU

InnoDB按 5:3 把鏈表分成New區和Old區,改良版LRU執行流程:

  • 首先,訪問New區的D1,和常規LRU一樣,將其移到鏈首
  • 然后,訪問一個新的不存在于當前鏈表的數據頁,這時依舊是淘汰掉鏈尾數據頁P但新插入的數據頁DX,放在old處
  • 處于old區的數據頁,每次被訪問時,都要判斷:
  • 若該數據頁在LRU鏈表中存在時間>1s,就把它移動到鏈表頭部
  • 若該數據頁在LRU鏈表中存在時間<1s,位置保持不變

1s由參數innodb_old_blocks_time控制

這種改良是專門為處理類似全表掃描的操作。還是掃描上百G的歷史數據表:

  • 掃描過程中,需要新插入的數據頁,都被放到old區域
  • 一個數據頁里面有多條記錄,這個數據頁會被多次訪問到,但由于順序掃描,這個數據頁第一次被訪問和最后一次被訪問的時間間隔不會超過1s,因此還是保留在old區
  • 再繼續掃描后續數據,之前的這個數據頁之后也不會再被訪問到,于是始終沒有機會移到鏈表頭部(New區),很快就會被淘汰

可見該策略最大的收益,就是在掃描大表時,雖然也用到BP,但對young區全無影響,從而保證了Buffer Pool響應正常業務的查詢命中率。

參考:

[1]. https://cloud.tencent.com/developer/article/1767570

[2]. https://juejin.cn/post/6854573221258199048

[3].https://time.geekbang.org/column/article/79407


責任編輯:武曉燕 來源: JavaEdge
相關推薦

2015-08-24 14:54:59

PHPMySQL數據查詢

2013-09-08 22:40:38

EF Code Fir數據查詢架構設計

2023-02-24 16:37:04

MySQL數據查詢數據庫

2015-06-15 12:58:39

大數據大數據查詢

2017-12-20 15:10:09

HBaseHadoop數據

2010-09-25 09:12:44

SQL Server

2022-01-12 18:35:54

MongoDB數據查詢

2021-09-16 23:33:41

大數據Sentry監控

2023-03-07 08:34:01

2017-09-01 09:52:20

PythonPandas數據分析

2020-11-26 15:51:11

SQL數據庫大數據

2024-12-20 16:41:22

2023-11-28 07:48:23

SQL Server數據庫

2023-09-07 07:30:26

Oracle數據庫

2021-04-09 23:00:12

SQL數據庫Pandas

2023-10-12 22:35:08

2015-06-23 10:53:02

TeradataJSON

2019-09-17 09:23:41

數據查詢Moneta

2019-11-27 09:48:04

數據ESHBase

2022-08-26 09:38:39

Pandas數據查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本激情一区二区 | 国产精品久久久久久久久久免费看 | 毛片毛片毛片毛片毛片 | 人人爽日日躁夜夜躁尤物 | 精品国产乱码久久久久久丨区2区 | 亚洲精品久久久久久一区二区 | 国产精品3区 | 欧美日韩一二区 | 中文字幕在线观看一区二区 | 国产精品视频综合 | 黄色毛片在线看 | 看av网| 国产亚洲精品综合一区 | 欧美激情久久久久久 | 视频一区二区在线观看 | 少妇淫片aaaaa毛片叫床爽 | 精品九九 | 91视频网| 一区二区在线 | 国产高清精品一区二区三区 | 日日欧美 | 在线免费中文字幕 | 久久久精品高清 | 操夜夜 | 欧美精品在线免费观看 | 国产粉嫩尤物极品99综合精品 | 福利一区在线观看 | 成人福利电影 | 久久久青草婷婷精品综合日韩 | 欧美xxxx色视频在线观看免费 | 亚洲精品中文字幕在线 | 久久高清国产视频 | 男人av在线播放 | 国产美女在线精品免费 | 亚洲成人av | 久久中文字幕一区 | 美女黄18岁以下禁止观看 | 色综合久久久 | 久久精品国产久精国产 | 在线a视频 | 一级a性色生活片久久毛片 午夜精品在线观看 |