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