ホームページ  >  記事  >  データベース  >  MySQL table_MySQL の ID が自己増加する問題の解決策

MySQL table_MySQL の ID が自己増加する問題の解決策

WBOY
WBOYオリジナル
2016-07-06 13:32:431108ブラウズ

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を取得しますが、それは使用しません


以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。よろしくお願いいたします。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。