背景 クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 InnoDB テーブルで主キーが定義されていない場合は、システムのデフォルトの増分 row_id (dict_sys->row_id) が主キーとして使用されます。行が挿入されるたびに 1 を追加し、最大値に達するまでこのプロセスを繰り返します。 dict_sys->row_id は unsigned long long として定義されていますが、この主キー値は 6 バイトしかないため、最大値は 2^48 になることに注意してください。 row_id がこの値を超えると、値は増加しますが、書き込み時に下位ビットのみが取得され、モジュロ演算と見なすことができます。 質問 これには問題があります。長時間実行される MySQL では、行が頻繁に挿入および削除される場合 (ログ テーブルなど)、最終的なテーブル サイズがそれほど大きくなくても、row_id 値の再利用が発生する可能性があります。また、主キー値であるため、繰り返すことはできないこともわかっています。 次のようなことが起こったとします。テーブルで、新しく挿入された行の row_id が古い行の row_id と競合します。何が起こるでしょうか? 確認する 実際、ここで必要な結論は 1 つだけです。この記事の目的は、検証方法について議論することです。上記の情報を基に、次の再現手順の設計を検討できます。 1) 主キーのない空のテーブルを作成する 2) gdbはdict_sys->row_idを1に設定する 3) 空のテーブルに複数の行を挿入する 4) gdbはdict_sys->row_idを2^48に設定する 5) さらに数行挿入する 6) 結果を見る 結論は ご覧のとおり、行 (1) と (2) は上書きされています。 より合理的な解決策は、MySQL テーブルの自動インクリメント主キーと同様に、重複キー エラーを報告することです。 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
<<: キープアライブキャッシュをクリアする方法の詳細なグラフィック説明
>>: Vue でキープアライブを使用した後にキャッシュをクリアする方法
MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...
状況の説明: データベースが異常に起動およびシャットダウンしたため、サービスを再度起動したときに「起...
XML/HTML コードコンテンツをクリップボードにコピー< div クラス= "c...
目次1. オペレーター要約する1. オペレーター演算子は、代入、比較、算術演算などの機能を実装するた...
LocalStorageはブール値を保存します今日、ブール値データを保存するために localsto...
1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...
CSS 変換は便利ですが、背景画像にはまだ適用されていません。この投稿では、背景画像を回転させたい場...
作業開発プロセス中に、顧客の名前、携帯電話番号、ID カード、およびドキュメントの種類を動的に保存す...
MySQL でデータを削除するには 2 つの方法があります。切り詰めは大まかな伐採の一種である削除は...
この記事の例では、チャットインターフェースの表示を実現するためのVueの具体的なコードを参考までに共...
入力を制限する一般的な方法1. ボタンが押されたときに点線のボックスを消すには、入力に属性値hide...
MySQL 8.0をインストールする docker run -p 63306:3306 -e MYS...
文章のスタイルでは、このような状況がよく見られます コードは次のとおりです <div styl...
jar パッケージを実行する Linux コマンドは次のとおりです。方法1: java -jar s...
目次概要サブクエリサブクエリの分類クエリの結果によるとサブクエリの位置で区別する選択後のサブクエリサ...