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 インデックスがあり、複数のファイル名を渡すことができます。同じ 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 は大きなテーブル データを迅速にクリアします

プロジェクト初 オンライン化する場合、パフォーマンステスト用に作成されるデータの量は膨大で、一部は使用できないが、一部は保持しなければならないため、多くの場合、体系的にデータをクリーンアップしたり、フィルタリングして除去したりする必要がある有用なデータをテーブルに挿入する前に。テーブル構造を維持するか、テーブルを再構築(データベースにテーブル構造をエクスポート)して、SQL ステートメントを再実行してください。

MySQL はテーブル データを削除またはクリアします

テーブル データをクリアする 5 つの方法

1. Truncate–すべてのデータを削除し、テーブル構造を保持します。元に戻して復元することはできません

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!