如果在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
專案初步上線,進行性能測試造的數據量巨大,都是些不可用數據,但又有一些是必須保留的,很多時候需要進行系統性的清理數據或者是,將有用的數據篩選出來之後再插入到表中!保留表格結構或重新建表(匯出資料庫中的表格結構),重新執行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中文網其他相關文章!