MySQL超大表怎麼快速刪除

王林
發布: 2023-05-28 16:55:13
轉載
4233 人瀏覽過

MySQL 超大表快速刪除

如果在MySQL中直接刪除大表可能會導致MySQL掛起,這可能會對業務產生負面影響。刪除超大表的前提是該表是獨立表空間,這樣刪除才有效。

表建立一個硬連結

# du -sh pay_bills.ibd 
175G        pay_bills.ibd
# 创建硬链接
# ln pay_bills.ibd pay_bills.ibd_hdlk
登入後複製

執行表刪除

在Linux中,每個儲存檔案都會有指向該檔案的Inode Index,多個檔案名稱可以通過相同Inode Index指向相同一個儲存檔案。

如果該檔案名稱引用的Inode Index上還被其他檔案名稱引用,則只會刪除該檔案名稱和Inode Index之間的引用

如果該檔案名稱引用的Inode Index上沒有被其他檔案名稱引用,則刪除該檔案名稱和Inode Index之間的引用並刪除Inode Index指向的儲存檔案。

實際上只是刪除了對pay_bills.ibd 的一個文件引用,我們pay_bills.ibd_hdlk 對物理文件的引用還是存在的,就不會執行OS級別的刪除操作,IO波動不大,降低對MySQL的影響。

mysql> drop table pay_bills;
Query OK, 0 rows affected (3.24 sec)
登入後複製

執行檔刪除

安裝truncate 工具

# yum install coreutils -y
登入後複製

#執行刪除腳本

#!/bin/bash
TRUNCATE=/usr/bin/truncate
# 从175G开始每次删除2G,最后如果脚本truncate后还剩下部分文件,使用rm删除
for i in `seq 175 -2 1`; do 
  $TRUNCATE -s ${i}G  pay_bills.ibd_hdlk
  sleep 1
done
rm -f pay_bills.ibd_hdlk
登入後複製

MySQL快速清除大表資料       

專案初步上線,進行性能測試造的數據量巨大,都是些不可用數據,但又有一些是必須保留的,很多時候需要進行系統性的清理數據或者是,將有用的數據篩選出來之後再插入到表中!保留表格結構或重新建表(匯出資料庫中的表格結構),重新執行SQL語句。

MySQL刪除或清空表數據

#清空表資料的五種方式

1、truncate–刪除所有數據,保留表結構,不能撤銷還原

2、delete–是逐行刪除速度極慢,不適合大量資料刪除

3、drop–刪除表,資料和表格結構一起刪除

# 4、匯出資料表結構,再執行一遍;

5、匯出資料庫所有資料表結構,再執行一遍,清空所有資料表(與4一致)

清空資料表資料語法

truncate table 表名;(僅保留表結構,速度很快)

delete from 表名;

delete from 表名where 列名="value ";

DROP `t_product_events` IF EXIST;
CREATE TABLE `t_product_events` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '事件ID',
`level` int(11) NULL DEFAULT NULL,
`product_id` bigint(20) NOT NULL COMMENT '产品类型ID',
`identifier` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件名称',
`description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '事件描述',
`type` int(11) NOT NULL COMMENT '事件类型,0:info(信息)、1:alert(告警)、2:error(故障)',
`ref_id` int(11) UNSIGNED NULL DEFAULT 0 COMMENT '引入模板时有意义',
`original_required` tinyint(2) NOT NULL,
`update_required` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否是标准功能的必选事件,0:可选,1:必选',
`custom` tinyint(2) NOT NULL COMMENT '0:模板导入,1:自定义',
`method` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件对应的方法名称(根据identifier生成)',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0),
`ref` bigint(20) NULL DEFAULT NULL,
`related` int(11) NULL DEFAULT 0 COMMENT '被预发布或者已发布关联个数',
`copyright` tinyint(2) NULL DEFAULT 0 COMMENT '是否发布过, 1 发布过 0未发布',
`prerelease` tinyint(2) NULL DEFAULT 0 COMMENT '是否预发布过, 1 预发布过 0未预发布',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_product_id`(`product_id`) USING BTREE COMMENT '查询优化'
) ENGINE = InnoDB AUTO_INCREMENT = 497560 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '产品类型事件表' ROW_FORMAT = Compact;
登入後複製

以上是MySQL超大表怎麼快速刪除的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!