MySQL innodb の自己インクリメント ID バグの影響をご存知ですか?

藏色散人
リリース: 2022-10-18 16:46:37
転載
2057 人が閲覧しました

これまでの MySQL はすべて無駄に使われてきました。 。 。 MySQL innodb ID の自動インクリメントのバグが既存のシステムの 99% に影響を与えることをご存知ですか。 。 。

MySQL innodb の自己インクリメント ID バグの影響をご存知ですか?

まず、この魔法の問題を再現しましょう:

自動インクリメント ID を持つテスト テーブルを作成し、3 つの部分を挿入します。のデータを削除し、ID = 3 のデータを削除します。

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
delete from test where id = 3;
ログイン後にコピー

次に、MySQL サービスを再起動しましょう。

レコードを再度挿入し、最後に挿入された ID を確認します。 。 。

insert into test values ();
select LAST_INSERT_ID();
select * from test;
ログイン後にコピー

結果は、再起動してレコードを再度挿入した後でも、ID は 3 のままです。 ! !

元の innodb 自動インクリメント ID は、サービスの再起動後にレコード内の最大 ID 1 に自動的に設定されます。

この問題は、物理的に削除されたシステムでは 100% の確率で再現されます。

あるテーブルの自動インクリメント ID が他のレコードにも関連付けられると仮定します。

極端な場合には、サービスを再起動する前に最大の ID を持つレコードが削除され、サービスが復元された後にそのレコードが挿入されて関連付けられます。 。 。

データの混乱の問題は想像できません。

幸いなことに、この問題は MySQL 8.0 で修正されました。

MySQL 5.7 以前のバージョンのユーザーであれば、心配する必要はありません。さまざまな解決策は次のとおりです:

* システム内のすべての物理的な削除を論理的な削除に変更します。通常、フレームワークにはこの機能が組み込まれており、修正や再構築に非常に便利です。

## innodb_autoinc_persistent 設定を有効にすると、1% のパフォーマンス損失が発生しますが、無視できます。

innodb_autoinc_persistent=on
innodb_autoinc_persistent_interval=1
ログイン後にコピー
推奨学習: 「

MySQL ビデオ チュートリアル

以上がMySQL innodb の自己インクリメント ID バグの影響をご存知ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yurunsoft.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート