應(yīng)對數(shù)據(jù)增多查詢慢策略1--歸檔歷史數(shù)據(jù)

一慢宗、背景

對于訂單這類具有時間屬性的數(shù)據(jù)奔穿,會隨時間累積,數(shù)據(jù)量越來越多贱田,為了提升查詢性能需要對數(shù)據(jù)進行拆分,首選的拆分方法是把舊數(shù)據(jù)歸檔到歷史表中去蔬墩。這種拆分方法能起到很好的效果,更重要的是對系統(tǒng)的改動小拇颅,升級成本低樟插。

很多大廠早年就是靠著此策略,撐了好幾年黄锤。還記得淘寶訂單搜索頁面”只能查詢僅此三個月訂單“么?

二勉吻、歸檔歷史數(shù)據(jù)

所謂歸檔旅赢,其實也是一種拆分數(shù)據(jù)的策略。簡單地說煮盼,就是把大量的歷史訂單移到另外一張歷史訂單表中。為什么這么做呢香到?因為像訂單這類具有時間屬性的數(shù)據(jù)报破,都存在熱尾效應(yīng)。大多數(shù)情況下訪問的都是最近的數(shù)據(jù)充易,但訂單表里面大量的數(shù)據(jù)都是不怎么常用的老數(shù)據(jù)。

因為新數(shù)據(jù)只占數(shù)據(jù)總量中很少的一部分炸茧,所以把新老數(shù)據(jù)分開之后稿静,新數(shù)據(jù)的數(shù)據(jù)量就會少很多,查詢速度也就會快很多控漠。老數(shù)據(jù)雖然和之前比起來沒少多少悬钳,查詢速度提升不明顯柬脸,但是毙驯,因為老數(shù)據(jù)訪很少會被訪問到灾测,所以慢一點兒也問題不大。

1.好處

拆分訂單時媳搪,2需要改動的代碼非常少

不需要修改的代碼

  • 大部分對訂單表的操作都是在訂單完成之前,這些業(yè)務(wù)邏輯都是完全不用修改的序愚。
  • 像退貨退款這類訂單完成后的操作等限,也是有時限的,那這些業(yè)務(wù)邏輯也不需要修改

需要修改的代碼

  • 查詢統(tǒng)計類功能形娇,會查歷史訂單
    按照時間筹误,選擇去訂單表還是歷史訂單表查詢就可以了。

2.具體操作方式

image.png

2.1不可以停服務(wù)

  • 創(chuàng)建于訂單表結(jié)構(gòu)一致的歷史訂單表
  • 把訂單表中數(shù)據(jù)分批查詢出來哄酝,插入歷史訂單表中祷膳。
    技術(shù)手段不限,不過如果是數(shù)據(jù)庫是主從分離的钾唬。請在從庫中查詢訂單數(shù)據(jù),再寫到主庫歷史訂單表中去奕巍,可以減少一些主庫的壓力
  • 不要著急刪除老訂單數(shù)據(jù)儒士,先驗證新代碼是否有bug,是否支持線上業(yè)務(wù)着撩。
  • 不要著急刪除老訂單數(shù)據(jù)匾委,先驗證新代碼是否有bug氓润。
  • 不要著急刪除老訂單數(shù)據(jù),先驗證新代碼是否有bug, 是否支持線上業(yè)務(wù)挨措。
    如果有bug 可以理解回滾代碼崩溪,不至于影響線上業(yè)務(wù)。
  • 等新版本代碼上線并驗證無誤之后觉既,就可以刪除訂單表中的歷史訂單數(shù)據(jù)了乳幸。
  • 上線一個定時腳本或定時任務(wù),定期把過期訂單數(shù)據(jù)從訂單表搬到歷史訂單表中反惕。

與訂單表相關(guān)的訂單子表也作如上操作,畢竟是根據(jù)訂單表id關(guān)聯(lián)背亥,伴隨增長的悬赏。

2.2可以停服務(wù)

簡單粗暴一點,近乎于重建了一次訂單表闽颇,不需要漫長的刪除歷史訂單的過程了。

  • 直接新建一張臨時訂單表
  • 將當前訂單表數(shù)據(jù)復(fù)制到臨時訂單表中
  • 把舊的訂單表改名尖啡,最后把臨時訂單表的表名改成正式訂單表

-- 新建一個臨時訂單表
create table orders_temp like orders;


-- 把當前訂單復(fù)制到臨時訂單表中
insert into orders_temp
  select * from orders
  where timestamp >= SUBDATE(CURDATE(),INTERVAL 3 month);


-- 修改替換表名
rename table orders to orders_to_be_droppd, orders_temp to orders;


-- 刪除舊表
drop table orders_to_be_dropp

三剩膘、 刪除大量數(shù)據(jù)

一次性刪除大量數(shù)據(jù),會提示刪除錯誤畏梆。所以需要分批刪除,以下以每1000條記錄刪除奠涌,建議執(zhí)行一次停頓一會,不要給數(shù)據(jù)庫造成太大壓力捏卓。

delete from orders
where timestamp < SUBDATE(CURDATE(),INTERVAL 3 month)
order by id limit 1000;

sql優(yōu)化 : 每次都要進行對大于時間戳的所有數(shù)據(jù)進行排序慈格,其實沒有必要

# 查詢符合的最大id
select max(id) from orders
where timestamp < SUBDATE(CURDATE(),INTERVAL 3 month);

# 符合小于id的數(shù)據(jù)進行排序,這數(shù)據(jù)量就減少很多
delete from orders
where id <= ?
order by id limit 1000;

為什么要排序呢?
為什么在刪除語句中非得加一個排序呢汤功?因為按 ID 排序后溜哮,我們每批刪除的記錄,基本都是 ID 連續(xù)的一批記錄茂嗓,由于 B+ 樹的有序性,這些 ID 相近的記錄忿族,在磁盤的物理文件上蝌矛,大致也是放在一起的,這樣刪除效率會比較高入撒,也便于 MySQL 回收頁。

四璃赡、 磁盤整理

大量的歷史訂單數(shù)據(jù)刪除完成之后献雅,如果你檢查一下 MySQL 占用的磁盤空間,你會發(fā)現(xiàn)它占用的磁盤空間并沒有變小豆励,這是什么原因呢?

只是指針標記為空閑良蒸,實際存儲單元未釋放。 一切為了速度

雖然邏輯上每個表是一顆 B+ 樹剿吻,但是物理上串纺,每條記錄都是存放在磁盤文件中的,這些記錄通過一些位置指針來組織成一顆 B+ 樹纺棺。當 MySQL 刪除一條記錄的時候,只能是找到記錄所在的文件中位置祷蝌,然后把文件的這塊區(qū)域標記為空閑,然后再修改 B+ 樹中相關(guān)的一些指針米丘,完成刪除糊啡。其實那條被刪除的記錄還是躺在那個文件的那個位置,所以并不會釋放磁盤空間棚蓄。

這么做也是沒有辦法的辦法,因為文件就是一段連續(xù)的二進制字節(jié)挣柬,類似于數(shù)組睛挚,它不支持從文件中間刪除一部分數(shù)據(jù)。如果非要這么刪除侧到,只能是把這個位置之后的所有數(shù)據(jù)往前挪淤击,這樣等于是要移動大量數(shù)據(jù),非常非常慢污抬。所以绳军,刪除的時候矢腻,只能是標記一下,并不真正刪除奶是,后續(xù)寫入新數(shù)據(jù)的時候再重用這塊兒空間竣灌。

對于InnoDB 釋放磁盤存儲

OPTIMIZE TABLE  tablename

OPTIMIZE TABLE 注意點:

  • 把這個表重建一遍,執(zhí)行過程中會一直鎖表及汉,也就是說這個時候下單都會被卡住
  • MySQL 的配置必須是每個表獨立一個表空間(innodb_file_per_table = ON)屯烦,如果所有表都是放在一起的,執(zhí)行 OPTIMIZE TABLE 也不會釋放磁盤空間漫贞。
  • 索引也會重建
    數(shù)據(jù)和索引都會變得緊湊迅脐,不僅占用磁盤空間減少豪嗽,查詢效率還提升不少。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隐锭,一起剝皮案震驚了整個濱河市计贰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荞怒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐桌,死亡現(xiàn)場離奇詭異象迎,居然都是意外死亡,警方通過查閱死者的電腦和手機啦撮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門逻族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聘鳞,你說我怎么就攤上這事≌境” “怎么了搏嗡?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長采盒。 經(jīng)常有香客問我,道長尺栖,這世上最難降的妖魔是什么烦租? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮挫以,結(jié)果婚禮上窃祝,老公的妹妹穿的比我還像新娘。我一直安慰自己粪小,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著突想,像睡著了一般究抓。 火紅的嫁衣襯著肌膚如雪袭灯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天橘茉,我揣著相機與錄音姨丈,去河邊找鬼。 笑死翁潘,一個胖子當著我的面吹牛歼争,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沐绒,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼乔遮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝉衣,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤病毡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啦膜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雀摘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年阵赠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片清蚀。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡枷邪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出东揣,到底是詐尸還是另有隱情,我是刑警寧澤童本,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布脸候,位于F島的核電站,受9級特大地震影響泵额,放射性物質(zhì)發(fā)生泄漏携添。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一羞秤、第九天 我趴在偏房一處隱蔽的房頂上張望左敌。 院中可真熱鬧,春花似錦矫限、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至经窖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間画侣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工溉卓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搬泥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓尉尾,卻偏偏與公主長得像燥透,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子班套,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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