MySQL でテーブル分割を実行すると、データが複数のテーブルに分散されるため、MySQL の自動インクリメントに依存して一意の ID を生成できなくなります。
自動インクリメントされる IP を主キーとして使用することは避けてください。データベース テーブルのパーティショニング操作に大きな不便が生じます。
postgreSQL、oracle、db2 データベースにはシーケンスという特別な機能があります。 データベースはいつでも、現在のテーブル内のレコード数のサイズとステップ サイズに基づいて、テーブル内の次のレコード番号を取得できます。ただし、MySQL にはそのようなシーケンス オブジェクトがありません。
次のメソッドを使用してシーケンス機能を実装し、一意の ID を生成できます:
1. MySQL テーブルを通じて ID を生成します
挿入、つまり挿入操作の最初のステップは、一意の ID を取得することです。具体的には、ID を作成し、レコードを挿入し、最後に挿入された ID を取得するためのテーブルが必要です。コードは次のとおりです:
リーリー
つまり、データを挿入する必要がある場合、このテーブルによって ID 値を生成する必要があります。私の PHP コードのメソッドは次のとおりです。
この方法はうまく機能しますが、同時実行性が高い状況では、MySQL の AUTO_INCREMENT によりデータベース全体が遅くなります。自動インクリメント フィールドがある場合、MySQL は自動インクリメント ロックを維持し、innodb は auto_increment 値を記録するためにメモリにカウンターを保存します。新しいデータ行が挿入されると、テーブル ロックが使用されてデータがロックされます。挿入が完了するまでカウンターを続けます。行ごとに挿入する場合は問題ありませんが、同時実行性が高い状況では、テーブルのロックにより SQL ブロックが発生し、パフォーマンスに大きな影響を及ぼし、max_connections 値に達する可能性もあります。
innodb_autoinc_lock_mode: 3つの値を設定可能: 0、1、2
0: 従来型 (毎回テーブルロックが生成されます)
1: 連続 (デフォルト、行数が予測できる場合は新しいメソッドが使用され、予測できない場合はテーブル ロックが使用され、連続挿入を保証するために単純な挿入に対してバッチ ロックが取得されます)
2: インターリーブ (テーブルをロックできず、1 つずつ処理し、同時実行性が最も高くなります)
myisam テーブル エンジンは従来型であり、毎回テーブルをロックします。
2. Redis を通じて ID を生成します
リーリー
3. キューモード
実はこれは上記の説明とも言えます
redis、memcacheq などのキュー サービスを使用して、キューに一定量の ID を事前に割り当てます。挿入が失敗した場合は、まずキューから ID を取得します。同時にキューの数を監視し、しきい値を下回ると自動的に要素をキューに追加します。
この方法により、計画的にIDを割り当てることができ、QQ番号や様々な美しい番号、明確な価格表示などの経済効果も期待できます。たとえば、Web サイトのユーザー ID により、ログイン、さまざまなアカウントの起動、および価格の明示が可能になります。通常の ID はスクランブルされ、ランダムに割り当てられます。
キューの数を監視し、自動的にキューを補充し、IDを取得しますが、それは使用しません