今日、ついに MySQL のサブデータベースとサブテーブルを理解したので、面接で自慢できます。
はじめに
同社は最近、サービスの分離とデータのセグメント化に取り組んでいます。これは、単一のパッケージ テーブル内のデータ量が非常に多すぎるためです。そして今でも1日あたり60Wで成長しています。
私はこれまでにデータベースのサブデータベースとサブテーブルについて学び、いくつかのブログ投稿を読んだことがありますが、漠然とした概念しか知りません。今考えてみると、すべてが漠然としています。
私は午後中ずっとデータベースのサブテーブルを読んだり、たくさんの記事を読んだりして過ごしましたが、ここで要約をします:
パート 1: 実際の Web サイト開発プロセスで直面する問題。
パート 2: セグメンテーションのさまざまな方法、垂直方向と水平方向の違いと適用可能な側面は何ですか。
パート 3: 現在市場に出回っているいくつかのオープンソース製品とテクノロジと、それらの長所と短所。
パート 4: おそらく最も重要なことは、データベースとテーブルを水平方向に分割することが推奨されない理由です。 ?これにより、計画の初期段階で慎重に扱うことができ、セグメンテーションによって引き起こされる問題を回避できます。
用語の説明
ライブラリ: データベース; テーブル: テーブル; サブデータベースおよびサブテーブル: シャーディング
データベース アーキテクチャは進化したばかりです。最初は単一マシンのデータベースを使用するだけで十分でした。その後、より多くのリクエストに直面したとき、複数のスレーブ データベース コピーを使用して、データベースの書き込み操作と読み取り操作を分離しました (スレーバー レプリケーション) は読み取りを担当し、マスター データベース (マスター ) は書き込みを担当し、スレーブ ライブラリはデータの一貫性を保つためにメイン ライブラリから同期してデータを更新します。アーキテクチャ的には、これはデータベースのマスターとスレーブの同期です。スレーブ ライブラリは水平方向に拡張できるため、読み取りリクエストが増えても問題ありません。
しかし、ユーザーの数が増加し、書き込みリクエストがますます増えた場合、どうすればよいでしょうか?マスターを追加しても問題は解決できません。データの一貫性が必要であり、書き込み操作には 2 つのマスター間の同期が必要ですが、これは複製に相当し、より複雑になるからです。
現時点では、シャーディングを使用して書き込み操作を分割する必要があります。
データベースとテーブルをシャーディングする前の問題
どんな問題も大きすぎたり、小さすぎたりします。ここで直面するデータの量は大きすぎます。 。
ユーザー リクエストの量が大きすぎます。
単一サーバーの TPS、メモリ、および IO が制限されているためです。
解決策: リクエストを複数のサーバーに分散します。実際、ユーザー リクエストと SQL クエリの実行は本質的に同じであり、どちらもリソースをリクエストしますが、ユーザー リクエストはゲートウェイ、ルーティング、http サーバーなども通過します。 。
単一データベースが大きすぎます
単一データベースの処理能力には制限があります;
単一データベースが配置されているサーバー上のディスク容量が不十分です。
単一データベース IO ボトルネックでの操作
解決策: より小さなライブラリに分割します
単一テーブルは大きすぎます
CRUD が問題です。
インデックス拡張、クエリ タイムアウト
解決策: より小さいデータ セットを含む複数のテーブルに分割します。
データベースとテーブルをシャーディングする方法
一般に、垂直スライスと水平スライスが使用されます。これは、結果セットの説明です。セグメンテーションの方法は物理空間セグメンテーションです。
私たちは直面している問題から出発し、解決していきます。
説明:
まず第一に、ユーザー リクエストの数が多すぎるため、処理するためにマシンを積み上げます (これはこの記事の焦点ではありません)
次に、単一のライブラリは大きすぎます。現時点では、テーブルが多すぎるとデータが多すぎる理由、または 1 つのテーブルにデータが多すぎる理由を確認する必要があります。
多数のテーブルと大量のデータがある場合は、垂直セグメンテーションを使用して、ビジネスに応じて異なるライブラリに分割します。
単一テーブル内のデータ量が大きすぎる場合は、水平セグメンテーションを使用する必要があります。つまり、テーブル内のデータが特定のルールに従って複数のテーブルに分割されるか、複数のデータベース上の複数のテーブルに分割される場合もあります。
データベースとテーブルのパーティショニングの順序は、最初に垂直パーティショニング、次に水平パーティショニングである必要があります
。縦割りのほうがシンプルで、現実世界の問題への対処方法とより一貫性があるからです。
垂直分割
垂直分割
つまり、列に基づいて「大きなテーブルを小さなテーブルに分割」します。田畑。一般に、テーブルには多くのフィールドがあり、一般的に使用されないもの、データが大きいもの、長さが長いもの (テキスト タイプのフィールドなど) は「拡張テーブル」に分割されます。これは通常、数百の列を持つ大規模なテーブルを対象としており、クエリ時にデータが多すぎることによって発生する「クロスページ」問題も回避します。
垂直サブライブラリ
垂直サブライブラリは、ユーザー用のデータベース、製品用のデータベース、注文用のデータベースなど、システム内のさまざまなビジネスを分割することを目的としています。分割後は1つのサーバーではなく複数のサーバーに配置する必要があります。なぜ?ショッピング Web サイトが外部世界にサービスを提供し、ユーザー、商品、注文などの CRUD があると想像してみましょう。分割前はすべてが 1 つのデータベースに集約されていたため、データベースの 単一データベースの処理能力がボトルネック
になりました。データベースを縦分割した後も、データベースサーバー上に配置したままでは、ユーザー数が増加するにつれて単一データベースの処理能力がボトルネックとなり、単一サーバーのディスク容量、メモリ、TPSなどが増大します。非常にきつくなります。。したがって、上記の問題を解決し、将来的に単一マシンのリソースの問題に直面しないようにするために、それを複数のサーバーに分割する必要があります。
ガバナンスと
劣化メカニズムに似ており、さまざまなビジネスのデータを管理、保守、監視することもできます。別途、拡張機能などアプリケーション システムのボトルネックとなりやすいのはデータベースであることが多く、データベース自体が
ステートフルであるため、Web サーバーやアプリケーション サーバーに比べて
水平拡張##を実現することが困難です。 #。データベース接続リソースは貴重であり、単一マシンの処理能力には制限があるため、同時実行性が高いシナリオでは、垂直サブデータベースは IO、接続数、および単一マシンのハードウェア リソースのボトルネックをある程度まで突破できます。 <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 1.3em;border-bottom: 2px solid rgb(239, 112, 96);">
<span style="margin-right: 3px;padding: 3px 10px 1px;display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);border-top-right-radius: 3px;border-top-left-radius: 3px;">水平分割</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span>
</h2>
<h3 id="水平分割テーブル">水平分割テーブル</h3>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">大量のデータを含む単一のテーブル (注文テーブルなど) の場合、特定のルール (<code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>RANGE、ハッシュ係数
など) に従って複数のテーブルに分割されます。ただし、これらのテーブルは依然として同じライブラリ内にあるため、ライブラリ レベルでの データベース操作には依然として IO ボトルネックが存在します
。お勧めしません。
データベースとテーブルの水平パーティショニング
単一テーブルのデータを複数のサーバーに分割します。各サーバーには対応するライブラリとテーブルがありますが、テーブル内のデータ コレクションは異なります。水平サブデータベースとサブテーブルは、単一マシンと単一データベースのパフォーマンスのボトルネックとプレッシャーを効果的に軽減し、IO、接続数、ハードウェア リソースなどのボトルネックを突破します。
水平データベース シャーディングとテーブル シャーディング ルール
RANGE
0 ~ 10000 の 1 つのテーブル、10001 ~ 20000 の 1 つのテーブル;
HASH モデル
ショッピング モール システムは通常、ユーザーと注文をメイン テーブルとして使用し、関連するテーブルを付録として使用します。データベース間のトランザクションなどの問題が発生しません。ユーザー ID を取得し、ハッシュの係数を取得して、それをさまざまなデータベースに配布します。
地理的地域
たとえば、当社のビジネスを中国東部、中国南部、中国北部に分けた場合、Qiniu Cloud は次のようになります。このような。
Time
時間で分割します。つまり、6 か月前または 1 年前のデータを切り取って、別のテーブルに置きます。時間の経過とともに、これらのテーブル内のデータがクエリされる確率は小さくなるため、これらのテーブルを「ホット データ」にまとめる必要がなくなります。これは「ホット データとコールド データの分離」でもあります。
データベースとテーブルのシャーディング後に直面する問題
トランザクション サポート
サブデータベースとテーブルその後、分散トランザクション
になりました。
データベース自体の分散トランザクション管理機能に依存してトランザクションを実行すると、高いパフォーマンスの代償を支払うことになります; アプリケーションがデータベースの制御を支援し、プログラム ロジック トランザクションを形成すると、プログラミングの問題にも負担がかかります。
複数のデータベース結果セットのマージ (group by、order by)
group by、order by と同様
このようなグループ化および並べ替えステートメントは使用できません
クロスデータベース結合
データベースをテーブルに分割した後は、テーブル間の関連付け操作が制限されるため、異なるデータベースにあるテーブルを結合したり、粒度の異なるテーブルを結合したりすることはできません。結果は、本来は 1 つのクエリで完了できるビジネスでも、完了するには複数のクエリが必要になる場合があります。大まかな解決策: グローバル テーブル: 基本データ、すべてのライブラリにコピーがあります。フィールドの冗長性: この方法では、一部のフィールドを結合によってクエリする必要がありません。システム層のアセンブリ: すべてを個別にクエリしてから組み立てますが、これはより複雑です。
サブデータベースおよびサブテーブルのソリューション製品
#市場には比較的多くのサブデータベースおよびサブテーブルのミドルウェアがあります。プロキシ メソッド MySQL Proxy
および Amoeba
に基づいており、Hibernate フレームワークに基づいているのは Hibernate Shards
であり、jdbc に基づいているのは Dangdangsharding-jdbc
です, mybatis 類似の Maven プラグインをベースに Spring の ibatis テンプレート クラスを書き換えた Mogujie の MogujieTSharding
と Cobar Client
があります。
いくつかの大企業のオープンソース製品もあります:
私は プログラマー Qingge
です。人生と共有するのが大好きな 90 年代以降のプログラマー。
この問題の概要と、Mysql サブデータベースとサブテーブルに関する解決策がここで紹介されています。皆様のお役に立てれば幸いです。パブリック アカウント Java 学習に引き続きご注目ください。今後の Java インタビュー記事。guide
。
以上が今日、ついに MySQL のサブデータベースとサブテーブルを理解したので、面接で自慢できます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

データベースから直接削除された行を直接回復することは、バックアップまたはトランザクションロールバックメカニズムがない限り、通常不可能です。キーポイント:トランザクションロールバック:トランザクションがデータの回復にコミットする前にロールバックを実行します。バックアップ:データベースの定期的なバックアップを使用して、データをすばやく復元できます。データベーススナップショット:データベースの読み取り専用コピーを作成し、データが誤って削除された後にデータを復元できます。削除ステートメントを使用して注意してください:誤って削除されないように条件を慎重に確認してください。 WHERE句を使用します:削除するデータを明示的に指定します。テスト環境を使用:削除操作を実行する前にテストします。

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。
