MySQL で大きなテーブルを直接削除すると、MySQL がハングし、ビジネスに悪影響を及ぼす可能性があります。非常に大きな表を削除するための前提条件は、削除が効果的に行われるように、その表が独立した表スペースであることです。
# du -sh pay_bills.ibd 175G pay_bills.ibd # 创建硬链接 # ln pay_bills.ibd pay_bills.ibd_hdlk
Linux では、保存された各ファイルにはそのファイルを指す Inode インデックスがあり、複数のファイル名を渡すことができます。同じ Inode インデックスは同じストレージ ファイルを指します。
ファイル名によって参照される Inode インデックスが他のファイル名によっても参照されている場合、ファイル名と Inode インデックスの間の参照のみが削除されます。ファイル名が他のファイル名で参照されていない場合は、ファイル名と Inode インデックスの間の参照を削除し、Inode インデックスが指すストレージ ファイルを削除します。
実際には、pay_bills.ibd へのファイル参照のみが削除されます。pay_bills.ibd_hdlk の物理ファイルへの参照はまだ存在するため、OS レベルの削除操作は実行されません。IO の変動は大きくありませんが、これにより、pay_bills.ibd_hdlk ファイルへの影響が軽減されます。MySQL への影響。
mysql> drop table pay_bills; Query OK, 0 rows affected (3.24 sec)
ファイル削除の実行
# 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 は大きなテーブル データを迅速にクリアします
テーブル データをクリアする 5 つの方法
2. delete– は行ごとに削除するのに非常に時間がかかるため、大量のデータの削除には適していません
3.drop– はテーブルとデータを削除します。テーブル構造は一緒に削除されます
4. テーブル構造をエクスポートして再度実行します;
5. データベースのすべてのテーブル構造をエクスポートし、再度実行してすべてのテーブルをクリアします (4 と一致します)。
テーブル データ構文のクリア
テーブル テーブル名を切り詰める; (テーブル構造のみが保持され、非常に高速です)テーブル名から削除します;
列名="値"のテーブル名から削除;
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 中国語 Web サイトの他の関連記事を参照してください。