【MongoDB】MongoDB中如何刪除一張大表中的數(shù)據(jù)啃洋?

MongoDB testDB庫(kù) test表數(shù)據(jù)結(jié)構(gòu)如下:

{
    "_id" : "5d6f830fd08e7055ff48613c",
    "xxx" : "xxxxxx",
    "xxx" : "xxxxxx",
    "time" : ISODate("2019-09-04T09:25:35.350Z"),
    "type" : "xxxxxx",
    "xxx" : "xxxxxx",
    "xxx" : "xxxxxx",
    "userAgent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
}

如果要?jiǎng)h除此表半年前的大概4億條數(shù)據(jù),是否會(huì)阻塞數(shù)據(jù)庫(kù)惫东?

刪除4億條數(shù)據(jù)可能會(huì)對(duì)數(shù)據(jù)庫(kù)性能產(chǎn)生一定的影響莉给,并且可能導(dǎo)致數(shù)據(jù)庫(kù)阻塞毙石。

為了避免這種情況廉沮,可以考慮采用分批刪除的方法,將刪除操作分成多個(gè)較小的批次進(jìn)行徐矩。

以下是一種分批刪除的方法:

  1. 確定每個(gè)批次要?jiǎng)h除的數(shù)據(jù)量滞时,例如每個(gè)批次刪除100萬條數(shù)據(jù)。
  2. 使用一個(gè)循環(huán)結(jié)構(gòu)滤灯,每次迭代刪除一個(gè)批次的數(shù)據(jù)坪稽,直到刪除完所有數(shù)據(jù)曼玩。
  3. 在每個(gè)批次刪除之間添加適當(dāng)?shù)难舆t,以降低對(duì)數(shù)據(jù)庫(kù)的負(fù)載窒百。

以下是一個(gè)示例的代碼片段黍判,用于分批刪除數(shù)據(jù):

var batchSize = 1000000; // 每個(gè)批次要?jiǎng)h除的數(shù)據(jù)量
var totalCount = db.test.count({ time: { $lt: new Date("2019-03-04T09:25:35.350Z") } }); // 要?jiǎng)h除的總數(shù)據(jù)量
var batches = Math.ceil(totalCount / batchSize); // 計(jì)算總共需要的批次數(shù)

for (var i = 0; i < batches; i++) {
  db.test.deleteMany({ time: { $lt: new Date("2019-03-04T09:25:35.350Z") } }, { limit: batchSize });
  sleep(1000); // 添加適當(dāng)?shù)难舆t,以降低對(duì)數(shù)據(jù)庫(kù)的負(fù)載
}

這段代碼會(huì)將刪除操作分成多個(gè)批次篙梢,每個(gè)批次刪除指定數(shù)量的數(shù)據(jù)顷帖,并在每個(gè)批次之間添加1秒的延遲。

請(qǐng)注意渤滞,根據(jù)您的具體情況贬墩,您可能需要根據(jù)數(shù)據(jù)庫(kù)的性能和資源限制來調(diào)整批次大小和延遲時(shí)間。此外妄呕,建議在非高峰期執(zhí)行此操作陶舞,并確保在執(zhí)行之前進(jìn)行適當(dāng)?shù)膫浞莺蜏y(cè)試。

time 字段沒有索引绪励,對(duì)刪除有什么影響嗎?

如果time字段沒有索引肿孵,對(duì)刪除操作可能會(huì)產(chǎn)生較大的性能影響。在執(zhí)行刪除操作時(shí)优炬,數(shù)據(jù)庫(kù)需要掃描整個(gè)集合來找到滿足刪除條件的文檔颁井。對(duì)于包含4億條數(shù)據(jù)的集合,這將需要耗費(fèi)大量的時(shí)間和系統(tǒng)資源蠢护。

沒有索引的情況下雅宾,刪除操作的性能取決于集合的大小和硬件資源。刪除大量數(shù)據(jù)可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)阻塞葵硕,影響其他查詢和操作的性能眉抬。

如果可能的話,強(qiáng)烈建議在執(zhí)行刪除操作之前為time字段創(chuàng)建一個(gè)索引懈凹。通過為time字段創(chuàng)建索引蜀变,可以大大提高刪除操作的性能,減少對(duì)數(shù)據(jù)庫(kù)的影響介评。

可以使用以下命令為time字段創(chuàng)建升序索引:

db.test.createIndex({ time: 1 }库北,{background: true})

請(qǐng)注意,為大型集合創(chuàng)建索引可能需要一些時(shí)間和系統(tǒng)資源们陆,因此建議在非高峰期執(zhí)行該操作寒瓦,并確保在執(zhí)行之前進(jìn)行適當(dāng)?shù)膫浞莺蜏y(cè)試。

給 time 字段加上索引坪仇,有多大意義杂腰?

time字段添加索引可以帶來多個(gè)好處:

  1. 提高查詢性能:當(dāng)您在查詢中使用time字段作為篩選條件時(shí),索引可以幫助數(shù)據(jù)庫(kù)快速定位滿足條件的文檔椅文,減少掃描的文檔數(shù)量喂很,從而提高查詢性能惜颇。

  2. 加速排序操作:如果您需要按照time字段進(jìn)行排序,索引可以加速排序操作少辣,避免對(duì)整個(gè)集合進(jìn)行排序凌摄,從而提高排序性能。

  3. 優(yōu)化范圍查詢:如果您需要執(zhí)行范圍查詢漓帅,例如查找某個(gè)時(shí)間段內(nèi)的文檔望伦,索引可以幫助快速定位和篩選滿足條件的文檔,加快查詢速度煎殷。

  4. 減少數(shù)據(jù)庫(kù)負(fù)載:通過使用索引屯伞,數(shù)據(jù)庫(kù)可以更高效地執(zhí)行查詢操作,減少了全表掃描的需求豪直,從而降低了數(shù)據(jù)庫(kù)服務(wù)器的負(fù)載劣摇。

總之,為time字段添加索引可以顯著提高查詢性能和排序性能弓乙,并減少數(shù)據(jù)庫(kù)負(fù)載末融。特別是在對(duì)time字段進(jìn)行頻繁的查詢和范圍查詢時(shí),索引的作用更為明顯暇韧。請(qǐng)注意勾习,索引可能會(huì)增加一些存儲(chǔ)空間和寫入性能的開銷,因此需要根據(jù)具體的業(yè)務(wù)需求進(jìn)行權(quán)衡和優(yōu)化懈玻。

如何要設(shè)置此表此后自動(dòng)保持最近半年數(shù)據(jù)巧婶,該如何操作?

要設(shè)置表自動(dòng)保留最近半年的數(shù)據(jù)涂乌,可以使用TTL(Time-To-Live)索引來實(shí)現(xiàn)艺栈。TTL索引允許您為文檔的某個(gè)字段設(shè)置過期時(shí)間,一旦過期湾盒,MongoDB會(huì)自動(dòng)刪除這些文檔湿右。

以下是實(shí)現(xiàn)自動(dòng)保留最近半年數(shù)據(jù)的操作:

  1. 創(chuàng)建一個(gè)TTL索引,并設(shè)置過期時(shí)間為半年(以秒為單位):
db.test.createIndex({ "time": 1 }, { expireAfterSeconds: 15778463, background: true })

這將為time字段創(chuàng)建一個(gè)TTL索引罚勾,并設(shè)置過期時(shí)間為15778463秒(半年)毅人。

  1. 確保在插入文檔時(shí),time字段包含一個(gè)日期值尖殃。確保插入的文檔中time字段使用ISO日期格式丈莺。
db.test.insertOne({ "time": ISODate("2022-01-01T00:00:00Z") })
  1. 確保MongoDB后臺(tái)進(jìn)程運(yùn)行,并且時(shí)間輪詢程序在后臺(tái)定期檢查并刪除過期的文檔分衫。

MongoDB會(huì)自動(dòng)處理過期文檔的刪除操作场刑,您無需手動(dòng)刪除般此。

請(qǐng)注意蚪战,TTL索引是基于時(shí)間的刪除機(jī)制牵现,其精度可能有所偏差。因此邀桑,刪除操作可能不會(huì)在過期時(shí)立即發(fā)生瞎疼,而是在后續(xù)的時(shí)間輪詢中進(jìn)行刪除。此外壁畸,TTL索引可能會(huì)對(duì)數(shù)據(jù)庫(kù)性能產(chǎn)生一定的影響贼急,請(qǐng)根據(jù)您的具體情況進(jìn)行評(píng)估和測(cè)試。

如果我對(duì) test表使用 db.test.createIndex({ time: 1 }捏萍,{background: true}) 創(chuàng)建過索引太抓,如何再執(zhí)行 db.test.createIndex({ "time": 1 }, { expireAfterSeconds: 15778463, background: true }) ?

如果您已經(jīng)對(duì)test表的time字段創(chuàng)建了一個(gè)普通索引(db.test.createIndex({ time: 1 }, { background: true }))令杈,然后想要進(jìn)一步創(chuàng)建一個(gè)TTL索引走敌,您可以執(zhí)行以下操作:

db.test.dropIndex({ time: 1 }) // 刪除現(xiàn)有的普通索引
db.test.createIndex({ "time": 1 }, { expireAfterSeconds: 15778463, background: true }) // 創(chuàng)建TTL索引

首先,使用db.test.dropIndex({ time: 1 })刪除現(xiàn)有的普通索引逗噩。然后掉丽,使用db.test.createIndex({ "time": 1 }, { expireAfterSeconds: 15778463, background: true })創(chuàng)建TTL索引。

通過這樣的操作异雁,您首先刪除了現(xiàn)有的索引捶障,然后創(chuàng)建了一個(gè)新的TTL索引。請(qǐng)注意纲刀,刪除索引和創(chuàng)建索引的操作可能會(huì)對(duì)數(shù)據(jù)庫(kù)的性能產(chǎn)生一定的影響项炼,請(qǐng)?jiān)诜歉叻迤趫?zhí)行,并確保在執(zhí)行之前進(jìn)行適當(dāng)?shù)膫浞莺蜏y(cè)試示绊。

在MongoDB中芥挣,db.collection.dropIndex()操作默認(rèn)是阻塞的,它會(huì)阻塞其他數(shù)據(jù)庫(kù)操作直到索引刪除完成耻台。目前空免,MongoDB沒有提供類似background: true的參數(shù)來在后臺(tái)刪除索引。

請(qǐng)注意盆耽,刪除索引和創(chuàng)建索引的操作可能會(huì)對(duì)數(shù)據(jù)庫(kù)的性能產(chǎn)生一定的影響蹋砚,請(qǐng)?jiān)诜歉叻迤趫?zhí)行,并確保在執(zhí)行之前進(jìn)行適當(dāng)?shù)膫浞莺蜏y(cè)試摄杂。

在MongoDB中坝咐,db.collection.dropIndex()操作默認(rèn)是阻塞的,它會(huì)阻塞其他數(shù)據(jù)庫(kù)操作直到索引刪除完成析恢。目前墨坚,MongoDB沒有提供類似background: true的參數(shù)來在后臺(tái)刪除索引。
這里的 阻塞其他數(shù)據(jù)庫(kù)操作 映挂,具體是阻塞什么操作泽篮?

在MongoDB中盗尸,當(dāng)執(zhí)行db.collection.dropIndex()操作刪除索引時(shí),它會(huì)阻塞以下操作:

  1. 同一集合上的其他寫操作:刪除索引的操作可能會(huì)導(dǎo)致對(duì)集合的寫操作(如插入帽撑、更新泼各、刪除)被阻塞,直到索引刪除成功為止亏拉。

  2. 對(duì)該索引的查詢操作:如果有查詢正在使用被刪除的索引扣蜻,它們可能會(huì)被阻塞,直到索引刪除成功為止及塘。

  3. 其他需要修改索引元數(shù)據(jù)的操作:例如莽使,修改索引選項(xiàng)或重建索引等操作可能會(huì)等待刪除索引的操作完成。

需要注意的是笙僚,索引刪除操作的阻塞是相對(duì)較短暫的吮旅,通常不會(huì)對(duì)數(shù)據(jù)庫(kù)的整體性能產(chǎn)生顯著的影響。但在某些情況下味咳,如果集合中包含大量文檔或索引較大庇勃,刪除索引可能需要一些時(shí)間和系統(tǒng)資源。

為了最小化對(duì)數(shù)據(jù)庫(kù)操作的阻塞影響槽驶,建議在非高峰期執(zhí)行索引刪除操作责嚷,并確保在執(zhí)行之前進(jìn)行適當(dāng)?shù)膫浞莺蜏y(cè)試。對(duì)于大型集合或需要頻繁刪除索引的情況掂铐,可以考慮在進(jìn)行索引刪除時(shí)罕拂,通過復(fù)制集群或分片集群來提供高可用性和負(fù)載均衡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末全陨,一起剝皮案震驚了整個(gè)濱河市爆班,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辱姨,老刑警劉巖柿菩,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雨涛,居然都是意外死亡枢舶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門替久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凉泄,“玉大人,你說我怎么就攤上這事蚯根『笾冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒂誉。 經(jīng)常有香客問我教藻,道長(zhǎng),這世上最難降的妖魔是什么拗盒? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮锥债,結(jié)果婚禮上陡蝇,老公的妹妹穿的比我還像新娘。我一直安慰自己哮肚,他們只是感情好登夫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允趟,像睡著了一般恼策。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潮剪,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天涣楷,我揣著相機(jī)與錄音,去河邊找鬼抗碰。 笑死狮斗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弧蝇。 我是一名探鬼主播碳褒,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼看疗!你這毒婦竟也來了沙峻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤两芳,失蹤者是張志新(化名)和其女友劉穎摔寨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怖辆,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祷肯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疗隶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佑笋。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斑鼻,靈堂內(nèi)的尸體忽然破棺而出蒋纬,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布蜀备,位于F島的核電站关摇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碾阁。R本人自食惡果不足惜输虱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脂凶。 院中可真熱鬧宪睹,春花似錦、人聲如沸蚕钦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘶居。三九已至罪帖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邮屁,已是汗流浹背整袁。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佑吝,地道東北人葬项。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迹蛤,于是被迫代替她去往敵國(guó)和親民珍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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