MySQL 水平拆分之后,自动增长的ID有什么好的解决办法?
黄舟
黄舟 2017-04-17 15:04:12
0
5
803

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(5)
大家讲道理

水平分割後、同じテーブルのデータは異なるライブラリに配置され、複数のライブラリ間で生成される 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
Ty80

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

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

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

いいねを押す +0
伊谢尔伦

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

を挿入するときに ID 値を指定します。
いいねを押す +0
刘奇

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

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

いいねを押す +0
迷茫

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート