検索

ホームページ  >  に質問  >  本文

MySQL 水平拆分之后,自动增长的ID有什么好的解决办法?

当单表的数据量过大时,会采用MySQL进行水平拆分,请问原先的自动增长的ID有什么好的解决办法?

黄舟黄舟2847日前806

全員に返信(5)返信します

  • 大家讲道理

    大家讲道理2017-04-17 15:06:12

    水平分割後、同じテーブルのデータは異なるライブラリに配置され、複数のライブラリ間で生成される ID の一意性を実現するためにデータベース自体の auto_increment に依存することはできなくなります。競合を引き起こします。
    では、ID はデータベースによって割り当てられるべきではないので、どのような状況が割り当てられるべきなのでしょうか。

    • アプリケーションが データベースミドルウェア を介してバックエンド MySQL にアクセスする場合、ID はミドルウェアによって生成される必要があります

    • ミドルウェアがない場合、ID はアプリケーションによって生成されます

    しかし、アプリケーションであろうとミドルウェアであろうと、必ず複数のアプリケーション (複数のクライアント) が存在し、ミドルウェアは通常、単一のインスタンスをデプロイしないため、単一点問題(単一障害点)、ミドルウェアは運用環境のクラスターにデプロイされます。

    上記のどの状況であっても、実際に必要なのは グローバル ID ジェネレーター です。

    グローバル ジェネレーターはさまざまな方法で実装できます

    • 公開データベースから ID を取得

    • Zookeeper クラスターに ID 生成戦略を設定し、Zookeeper クラスターのグローバル ID を取得します

    これが基本戦略です。もう 1 つ細かい点があります。

    グローバル ID は テーブル に分割するのが最適です。1 つのテーブルがグローバル ID コンテキストに対応し、異なるテーブルが異なるグローバル ID コンテキストから取得されます。

    もう 1 つ、ミドルウェアであってもアプリケーションであっても、グローバル ID を取得するとき を毎回 1 つだけ取得するのではなく 、そのパフォーマンスは低すぎます。より良い方法は、毎回 を取得することです。たとえば、アプリケーション 1 が ID 1 ~ 50 を取得した場合、アプリケーション 2 も ID を取得すると、50 個の ID が使い果たされるまで ID を取得する必要がなくなります。 ID 51-100 にとって、このアイデアは冬に備えて食料を保管するのと似ています。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 15:06:12

    現在知られている方法:
    1. 元の自動インクリメント列を非自動インクリメント主キーに変更します。主キーを自分で管理します

    2. 水平分割とは、既存のデータを分割することを意味し、分割テーブル内のデータは変更されません。新しく追加されたデータは引き続き自動的に追加されます。 (自動インクリメントと空白の ID は設定できないことに注意してください)

    3. 統一されたアルゴリズムを作成します。自動インクリメント ID は、自動的に維持されるのではなく、計算されて書き込まれる必要があります

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:06:12

    私は以前にもそのような必要があったことがあります。
    これは私の処理方法です。主キー列の自動インクリメントを削除し、redis の incr を通じて自動インクリメント シーケンス値を生成し、

    を挿入するときに ID 値を指定します。

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 15:06:12

    1. ID の自動インクリメント機能をテーブルとストアド プロシージャを使用して小さなモジュールにします。

    2. 分割テーブルにデータ INSERT がある場合、このストアド プロシージャが呼び出され、新しい ID が適用されます。

    返事
    0
  • 迷茫

    迷茫2017-04-17 15:06:12

    テーブルを分割した後、主キーを自分で生成するのが最善です。Twitter のスノーフレークなど、オープンソースの主キー生成戦略アルゴリズムが多数あります。
    プログラムを変更したくない場合は、次のように設定します。各クラスターの自動インクリメント ID の開始点 (auto_increment_offset) と ID 自動インクリメント ステップ (auto_increment_increment) は、各クラスターの開始点をずらして、ID を相対的にセグメント化し、グローバルな一意性を実現します。利点は、実装が簡単でアプリケーションに対して透過的であることです。欠点は、将来的に ID に基づいてルーティングが行われる場合、拡張が容易ではないことです。

    返事
    0
  • キャンセル返事