MySQL清理數(shù)據(jù)并釋放磁盤(pán)空間的實(shí)現(xiàn)示例
在我們的生產(chǎn)環(huán)境中有一張表:courier_consume_fail_message,是存放消息消費(fèi)失敗的數(shù)據(jù)的,設(shè)計(jì)之初,這張表的數(shù)據(jù)量評(píng)估在萬(wàn)級(jí)別以下,因此沒(méi)有建立索引。
但目前發(fā)現(xiàn),該表的數(shù)據(jù)量已經(jīng)達(dá)到百萬(wàn)級(jí)別,原因產(chǎn)生了大量的重試消費(fèi),這導(dǎo)致了該表的慢查詢(xún)。
因此需要清理該表數(shù)據(jù)。而實(shí)際上,使用 DELETE 命令刪除數(shù)據(jù)后,我們發(fā)現(xiàn)查詢(xún)速度并沒(méi)有顯著提高,甚至可能會(huì)降低。為什么?
因?yàn)?DELETE 命令只是標(biāo)記該行數(shù)據(jù)為“已刪除”狀態(tài),并不會(huì)立即釋放該行數(shù)據(jù)在磁盤(pán)中所占用的存儲(chǔ)空間,這樣就會(huì)導(dǎo)致數(shù)據(jù)文件中存在大量的碎片,從而影響查詢(xún)性能。所以,除了刪除表記錄外,還需要清理磁盤(pán)碎片。
在表碎片清理前,我們關(guān)注以下四個(gè)指標(biāo)。
- 指標(biāo)一:表的狀態(tài):
SHOW TABLE STATUS LIKE 'courier_consume_fail_message';
- 指標(biāo)二:表的實(shí)際行數(shù):
SELECT count(*) FROM courier_consume_fail_message;
- 指標(biāo)三:要清理的行數(shù):
SELECT count(*) FROM courier_consume_fail_message where created_at < '2023-04-19 00:00:00';
- 指標(biāo)四:表查詢(xún)的執(zhí)行計(jì)劃:
EXPLAIN SELECT * FROM courier_consume_fail_message WHERE service='courier-transfer-mq';
?-- 清理磁盤(pán)碎片 ?OPTIMIZE TABLE courier_consume_fail_message;
以下是清理前后的指標(biāo)對(duì)比。
一、清理前
指標(biāo)一,表的狀態(tài):
指標(biāo)二,表的實(shí)際行數(shù):76986
指標(biāo)三,要清理的行數(shù):76813
指標(biāo)四,表查詢(xún)的執(zhí)行計(jì)劃:
二、清理數(shù)據(jù)
下面是執(zhí)行 DELETE FROM courier_consume_fail_message WHERE created_at < '2023-04-19 00:00:00';
后的統(tǒng)計(jì)。
指標(biāo)一,表的狀態(tài):
指標(biāo)二,表的實(shí)際行數(shù):173
指標(biāo)三,要清理的行數(shù):0
指標(biāo)四,表查詢(xún)的執(zhí)行計(jì)劃:
通過(guò)指標(biāo)四可以看到,清理表記錄后,查詢(xún)掃描的行數(shù)依然沒(méi)變:8651048。
三、清理碎片
下面是執(zhí)行 OPTIMIZE TABLE courier_consume_fail_message;
后的統(tǒng)計(jì)。
指標(biāo)一,表的狀態(tài):
指標(biāo)四,表查詢(xún)的執(zhí)行計(jì)劃:
通過(guò)指標(biāo)四可以看到,清理表記錄后,查詢(xún)掃描的行數(shù)變成了 100。
小結(jié)
可以看到,該表的數(shù)據(jù)行數(shù)和數(shù)據(jù)長(zhǎng)度都被清理了,查詢(xún)語(yǔ)句掃描的行數(shù)也減少了。
為了提升 SELECT * FROM courier_consume_fail_message WHERE service='courier-transfer-mq';
語(yǔ)句的查詢(xún)效率,還是應(yīng)當(dāng)建立索引。
?alter` `table` `ec_courier.courier_consume_fail_message ``add` `index` `idx_service(service);
到此這篇關(guān)于MySQL清理數(shù)據(jù)并釋放磁盤(pán)空間的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL 清理數(shù)據(jù)并釋放磁盤(pán)空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作
這篇文章主要介紹了基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06MySQL學(xué)習(xí)之基礎(chǔ)操作總結(jié)
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在WEB應(yīng)用方面 MySQL 是最好的。本文將為大家詳細(xì)介紹一下MySQL的基礎(chǔ)操作,需要的可以參考一下2022-03-03MySQL數(shù)據(jù)庫(kù)高級(jí)數(shù)據(jù)操作之新增數(shù)據(jù)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)高級(jí)數(shù)據(jù)操作之新增數(shù)據(jù),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06設(shè)置MySQLroot賬戶(hù)密碼報(bào)錯(cuò)ERROR 1064 (42000): You 
在安裝mysql的時(shí)候,設(shè)置root賬戶(hù)密碼出現(xiàn)了ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds..錯(cuò)誤,本文小編給大家介紹了相關(guān)的解決方案,需要的朋友可以參考下2023-12-12解決Windows安裝mysql時(shí)提示MSVCR120.DLL動(dòng)態(tài)庫(kù)缺失問(wèn)題
在Windows Server 2012系統(tǒng)上安裝MySQL 5.7時(shí)遇到“由于找不到MSVCR120.dll,無(wú)法繼續(xù)執(zhí)行代碼”的錯(cuò)誤,原因是系統(tǒng)缺少部分配置文件,解決方法是下載并安裝vcredist文件2025-02-02MySQL8.0無(wú)法啟動(dòng)3534的解決方法
本文主要是記錄一下自己使用MySQL的一次踩坑經(jīng)歷,我的MySQL安裝好后,使用一周后的同一時(shí)間必定報(bào)連接失敗,然后查找發(fā)現(xiàn)是MySQL本地服務(wù)沒(méi)有啟動(dòng),下面就詳細(xì)的介紹一下2021-06-06Mysql用戶(hù)權(quán)限分配實(shí)戰(zhàn)項(xiàng)目詳解
用戶(hù)是數(shù)據(jù)庫(kù)的使用者和管理者,MySQL通過(guò)用戶(hù)的設(shè)置來(lái)控制數(shù)據(jù)庫(kù)操作人員的訪問(wèn)與操作范圍,這篇文章主要給大家介紹了關(guān)于Mysql用戶(hù)權(quán)限分配實(shí)戰(zhàn)項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-12-12mysql server is running with the --skip-grant-tables option
今天在mysql中新建數(shù)據(jù)庫(kù)提示The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement,原來(lái)是數(shù)據(jù)中配置的--skip-grant-tables,這樣安全就降低了,這個(gè)一般當(dāng)忘記root密碼的時(shí)候需要這樣操作2017-07-07安裝配置MySQLMTOP來(lái)監(jiān)控MySQL運(yùn)行性能的教程
這篇文章主要介紹了安裝配置MySQLMTOP來(lái)監(jiān)控MySQL運(yùn)行性能的教程,MySQLMTOP具有B/S方式的圖形化操作頁(yè)面,需要的朋友可以參考下2015-12-12