33 | 我查這么多數(shù)據(jù)磺樱,會(huì)不會(huì)把數(shù)據(jù)庫內(nèi)存打爆纳猫?

一紧阔、全表掃描對 server 層的影響

主機(jī)內(nèi)存100G,對200G 大表?db1. t全表掃描续担,不會(huì)把數(shù)據(jù)庫主機(jī)內(nèi)存用光(分段給客戶端)

mysql -h$host? -P$port -u$user -p$pwd -e "select * from db1.t" > $target_file

InnoDB 數(shù)據(jù)是保存主鍵索引上的擅耽,直接掃描主鍵索引。沒有其他判斷條件物遇,查到每行放到結(jié)果集(服務(wù)端不需保存完整結(jié)果集)乖仇,返回客戶端

1.1 取询兴、發(fā)數(shù)據(jù)流程

1.? 取一行乃沙,寫net_buffer 中。net_buffer_length 內(nèi)存大小默認(rèn)16k诗舰。

2.? 重復(fù)獲取行警儒,直到 net_buffer 寫滿,調(diào)網(wǎng)絡(luò)接口發(fā)出眶根。

3.? 發(fā)送成功蜀铲,清空 net_buffer繼續(xù)。

4.? 發(fā)送返回 EAGAIN WSAEWOULDBLOCK属百,本地網(wǎng)絡(luò)棧(socket send buffer)寫滿记劝,等待重新可寫

圖 1 查詢結(jié)果發(fā)送流程??

1.? 查詢發(fā)送過程中,占用內(nèi)存最大net_buffer_length 族扰,不會(huì)200G厌丑;

2.? socket send buffer 不可能達(dá)到 200G(默認(rèn)定義/proc/sys/net/core/wmem_default),被寫滿渔呵,就暫停讀

1.2?MySQL 邊讀邊發(fā)的客戶端接收慢怒竿,導(dǎo)致 MySQL 服務(wù)端發(fā)不出去,執(zhí)行時(shí)間長扩氢。

客戶端不讀 socket receive buffer 耕驰,服務(wù)端 show processlist?

圖 2 服務(wù)端發(fā)送阻塞

“Sending to?client”,服務(wù)器端網(wǎng)絡(luò)棧寫滿类茂。

–quick 參數(shù)耍属,用mysql_use_result 方法托嚣。讀一行處理一行巩检。處理邏輯如果很慢,如圖 2 情況示启。

正常線上業(yè)務(wù)說兢哭,查詢返回不多,mysql_store_result 查詢結(jié)果保存本地內(nèi)存夫嗓。

第 30 篇文章大查詢導(dǎo)致客戶端占用內(nèi)存近 20G迟螺,用mysql_use_result 接口冲秽。“Sending to client”優(yōu)化查詢結(jié)果矩父,并評估這么多的返回結(jié)果是否合理锉桑。

快速減少線程,net_buffer_length設(shè)置更大

1.3 Sending data

Sending to client:等待客戶端接收結(jié)果

Sending data:正在執(zhí)行窍株,如發(fā)送數(shù)據(jù)民轴,查詢,鎖等待

網(wǎng)絡(luò)沒問題球订,為什么 Sending data 要這么久后裸?

查詢執(zhí)行狀態(tài)“Sending data”;發(fā)送執(zhí)行結(jié)果給客戶端冒滩;繼續(xù)微驶,完成設(shè)置成空字符串?

B 等鎖 Sending data:

圖 3 讀全表被鎖
圖 4 Sending data 狀態(tài)??

二、全表掃描對 InnoDB 的影響

2.1?Buffer Pool

第 2第 15 篇介紹 WAL 機(jī)制开睡,InnoDB 內(nèi)存保存更新結(jié)果因苹,配合 redo log避免隨機(jī)寫盤篇恒。

Buffer Pool (BP) 管理內(nèi)存數(shù)據(jù)頁容燕, WAL加速更新、查詢

提交時(shí)婚度,磁盤上數(shù)據(jù)頁蘸秘,查詢來讀, redo log 不需要馬上應(yīng)用到數(shù)據(jù)頁

因?yàn)椋?b>直接讀內(nèi)存數(shù)據(jù)頁(最新)蝗茁,不需讀磁盤醋虏,速度快。

Buffer Pool加速查詢哮翘,依賴內(nèi)存命中率颈嚼。

2.2 內(nèi)存命中率

show engine innodb status 穩(wěn)定線上系統(tǒng),保證響應(yīng)時(shí)間符合饭寺, 99% 以上阻课。

“Buffer pool hit rate”命中率:99.0%。

圖 5 show engine innodb status 顯示內(nèi)存命中率

需要數(shù)據(jù)頁都直接從內(nèi)存得艰匙,命中率100%(生產(chǎn)上難做到)

2.3?Buffer Pool算法

大小innodb_buffer_pool_size 確定限煞,物理內(nèi)存 60%~80%。小于磁盤常見员凝。

十年前署驻,單機(jī)數(shù)據(jù)量上百個(gè) G物理內(nèi)存幾個(gè) G;服務(wù)器 128G 甚至更高內(nèi)存旺上,單機(jī)數(shù)據(jù)量卻 T 級別瓶蚂。

淘汰最久未用 (Least Recently Used, LRU) 算法(鏈表實(shí)現(xiàn))

圖 6 基本 LRU 算法??

1.? 鏈表頭部 P1,最近被訪問數(shù)據(jù)頁宣吱;

2.? 訪問 P3窃这,P3 最前面;

3.? 訪問數(shù)據(jù)頁不在鏈表中征候,Buffer Pool 申請數(shù)據(jù)頁 Px加頭部钦听。內(nèi)存已經(jīng)滿,清空末尾 Pm 倍奢。

2.4 全表掃描問題:

不能直接使用 LRU 算法:掃描200G 歷史數(shù)據(jù)表朴上,平時(shí)沒有業(yè)務(wù)訪問它。

Buffer Pool 全部淘汰卒煞。正在業(yè)務(wù)服務(wù)庫痪宰,內(nèi)存命中率下降,磁盤壓力增加畔裕,SQL 慢衣撬。改進(jìn):

圖 7 改進(jìn)的 LRU 算法

?5:3 LRU 鏈表分?young(頭 5/8) old?(表尾3/8)。

1.? 訪問數(shù)據(jù)頁 P3扮饶,young 具练,移到鏈表頭部

2.? 淘汰掉數(shù)據(jù)頁 Pm, Px在 LRU_old 處甜无。

3.? old 每次被訪問扛点,都要判斷:超過 1 秒移到頭部否則不變innodb_old_blocks_time 控制岂丘。默認(rèn)值1000毫秒陵究。

順序掃描,數(shù)據(jù)頁第一次和最后次被訪問奥帘,間隔不超 1 秒铜邮, 一直在old ,很快被淘汰寨蹋。

優(yōu)點(diǎn):用到Buffer Pool松蒜,對 young沒影響,保證 Buffer Pool 命中率已旧。

小結(jié)

查詢結(jié)果秸苗,發(fā)送客戶端過程。

邊算邊發(fā)评姨,大結(jié)果难述,server 端不會(huì)保存完整結(jié)果集萤晴。讀不及時(shí)吐句,堵MySQL 查詢過程胁后,不會(huì)內(nèi)存打爆。

淘汰策略嗦枢,大查詢不會(huì)內(nèi)存暴漲攀芯。冷數(shù)據(jù)全表掃描,對 Buffer Pool 的影響也能可控文虏。

全表掃描耗費(fèi) IO 資源侣诺,高峰期不能直接線上主庫全表掃描

思考題

客戶端性能問題氧秘,對數(shù)據(jù)庫影響更嚴(yán)重年鸳?怎么優(yōu)化?

問題核心“長事務(wù)”丸相。結(jié)合鎖搔确、MVCC 。

更新占行鎖灭忠,的語句被鎖住膳算;

事務(wù)也有問題undo log 不能被回收弛作,導(dǎo)致回滾段空間膨脹涕蜂。

評論1

mysql dump對業(yè)務(wù)db做邏輯備份保存客戶端(虛擬機(jī)),磁盤很快滿映琳,導(dǎo)致server端出現(xiàn)sending to client狀態(tài)机隙,db更新頻繁,undo表空間變大萨西,堵塞黍瞧,服務(wù)端磁盤空間不足

評論2

兩個(gè)客戶端都update:第一個(gè)select * from t for update 遲遲不返回?cái)?shù)據(jù)原杂,server端長期占行鎖印颤,其他更新被鎖定,報(bào)鎖等待超時(shí)錯(cuò)誤.

同一個(gè)事務(wù)穿肄,更新之后要盡快提交年局,不要做沒必要的查詢,尤其是不要執(zhí)行需要返回大量數(shù)據(jù)的查詢咸产;

評論3

“Sending to client”服務(wù)器端網(wǎng)絡(luò)棧寫滿矢否。快速減少 net_buffer_length 設(shè)更大值

net_buffer_length 加再大脑溢, socket send buffer 小僵朗,網(wǎng)絡(luò)棧還寫滿狀態(tài)赖欣?

沒發(fā)完緩存net_buffer中,對執(zhí)行器都是“已經(jīng)寫出去”验庙。

net_buffer_length 改大顶吮,不會(huì)“Sending to client”?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粪薛,隨后出現(xiàn)的幾起案子悴了,更是在濱河造成了極大的恐慌,老刑警劉巖违寿,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湃交,死亡現(xiàn)場離奇詭異,居然都是意外死亡藤巢,警方通過查閱死者的電腦和手機(jī)搞莺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂咒,“玉大人才沧,你說我怎么就攤上這事∏卫” “怎么了糜工?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長录淡。 經(jīng)常有香客問我捌木,道長,這世上最難降的妖魔是什么嫉戚? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任刨裆,我火速辦了婚禮,結(jié)果婚禮上彬檀,老公的妹妹穿的比我還像新娘帆啃。我一直安慰自己,他們只是感情好窍帝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布努潘。 她就那樣靜靜地躺著,像睡著了一般坤学。 火紅的嫁衣襯著肌膚如雪疯坤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天深浮,我揣著相機(jī)與錄音压怠,去河邊找鬼。 笑死飞苇,一個(gè)胖子當(dāng)著我的面吹牛菌瘫,可吹牛的內(nèi)容都是我干的蜗顽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼雨让,長吁一口氣:“原來是場噩夢啊……” “哼雇盖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宫患,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刊懈,失蹤者是張志新(化名)和其女友劉穎这弧,沒想到半個(gè)月后娃闲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匾浪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年皇帮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛋辈。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡属拾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冷溶,到底是詐尸還是另有隱情渐白,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布逞频,位于F島的核電站纯衍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苗胀。R本人自食惡果不足惜襟诸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望基协。 院中可真熱鬧歌亲,春花似錦、人聲如沸澜驮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杂穷。三九已至悍缠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亭畜,已是汗流浹背扮休。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拴鸵,地道東北人玷坠。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓蜗搔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親八堡。 傳聞我的和親對象是個(gè)殘疾皇子樟凄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容