数百億のデータがテーブルに分割された後のページング クエリを理解する
mysql ビデオ チュートリアル 列では、数百億のデータのページング クエリを紹介します。
#事業規模がある程度の規模に達すると、タオバオの1日の注文量は5,000万件を超え、美団の1日の注文量は5,000万件を超えます。注文数は3,000万件を超えています。データベースが大規模なデータ負荷に直面している場合、サブデータベースとテーブルのサブ操作が必要になります。データベースがテーブルに分割された後、一部の通常のクエリで問題が発生する可能性があります。最も一般的なのはページング クエリです。通常、シャーディング テーブルのフィールドのことを shardingkey と呼びます。たとえば、注文テーブルではユーザー ID が shardingkey として使用されます。では、クエリ条件にユーザー ID が含まれていない場合にページングを行うにはどうすればよいでしょうか?たとえば、シャーディング キーがない場合、どのようにしてより多くの多次元クエリを実行できるでしょうか?
一意の主キー
一般に、データベースの主キーは自動的にインクリメントされるため、テーブル分割後の主キーの競合の問題は避けられません。最も簡単な方法は、次の方法です。ユニークなビジネス このフィールドは唯一の主キーとして機能します。たとえば、注文テーブルの注文番号はグローバルに一意である必要があります。
一意の ID を生成する一般的な分散方法は数多くありますが、最も一般的なものは Snowflake アルゴリズム、Didi Tinyid、Meituan Leaf です。スノーフレーク アルゴリズムを例にとると、1 ミリ秒以内に複数の ID を生成できます。
最初のビットは使用されず、デフォルトは0です。41桁のタイムスタンプはミリ秒単位で正確で、69年に対応でき、10桁は機能します。マシン ID の上位 5 桁はデータセンター ID、下位 5 桁はノード ID、12 桁のシリアル番号 各ノードはミリ秒ごとに蓄積され、合計は 2^12 に達することがあります。 4096 ID。
パーティション化
最初のステップは、テーブルを分割した後の順序番号が一意であることを確認することです。次に、テーブルの分割の問題を考えてみましょう。まず、サブテーブル自体の業務量と増分に基づいて、サブテーブルのサイズを検討します。
たとえば、当社の 1 日あたりの注文量は現在 100,000 件ですが、1 年後には 1 日あたり 100 万件に達すると推定されています。ビジネス属性に応じて、通常は半年以内に注文のクエリをサポートします。半年を超える注文はアーカイブが必要です。
したがって、半年間で 1 日あたり 100 万件の注文に基づくと、個別のテーブルを使用しない場合、注文量は 100 万件に達します。たとえ RT の時間を処理できたとしても、それを受け入れることはできません。経験によれば、1 つのテーブルの数が数百万であればデータベースに負荷はかからないため、テーブルを 256 個のテーブル (1 億 8,000 万/256 ≈ 700,000) に分割するだけで十分です。 512 のテーブルに分割することもできます。次に、ビジネス量がさらに 10 倍増加して 1 日あたり 1,000 万件の注文になった場合、サブテーブル 1024 がより適切な選択となることを考えてください。
半年以上にわたってテーブルを分割し、データをアーカイブした結果、単一テーブル内の 700,000 データは、ほとんどのシナリオに十分に対応できるようになりました。次に、注文番号をハッシュし、256 の剰余を取得して、それがどのテーブルに該当するかを決定します。
まあ、主キーは注文番号のみなので、過去に主キーIDを元に書いたクエリは使えません。これには履歴が必要です。 . クエリ機能の変更。でも、これは問題ないですよね? 注文番号で確認するように変更すれば大丈夫です。これはどれも問題ではありません。問題はタイトルにあるとおりです。
C 側クエリ
長々と話してようやく本題に到達したのですが、テーブル分割後のクエリとページングクエリの問題をどうやって解決するのでしょうか?
まず、シャーディング キーを使用したクエリについて説明します。たとえば、注文番号によるクエリです。何をしても、クエリ対象の特定のテーブルを直接見つけることができます。明らかに問題はありません。クエリで。
シャーディング キーではなく、上記の例で注文番号がシャーディング キーとして使用されている場合、APP や小規模なプログラムは通常、ユーザー ID を通じてクエリされます。注文番号を通して?多くの企業の注文テーブルでは、ユーザー ID をシャーディング キーとして直接使用します。これは非常にシンプルで、直接確認できます。では、注文番号はどうすればよいのでしょうか? 非常に簡単な方法は、ユーザー ID 属性を注文番号に追加することです。非常に単純な例を挙げると、元の 41 桁のタイムスタンプを使い切ることはできないと考えます。ユーザー ID は 10 桁です。注文番号生成ルールにはユーザー ID が含まれています。特定のテーブルに入るとき、10 桁のユーザー注文番号のIDハッシュを使用し、注文番号やユーザーIDに関わらずクエリの効果が同じになるように法を計算します。
もちろん、この方法は一例であり、具体的な注文番号の生成ルール、桁数、要素を含めるなどの具体的な内容は、自社のビジネスや実装メカニズムに応じて決定されます。
わかりました。注文番号またはユーザー ID をシャーディング キーとして使用する場合は、上記の 2 つの方法に従って問題を解決できます。次に、別の質問があります。注文番号でもユーザー ID クエリでもない場合はどうすればよいですか?最も直感的な例は、販売者側またはバックエンドからのクエリです。販売者側は、販売者または販売者の ID をクエリ条件として使用します。バックグラウンドでのクエリ条件は、私が遭遇したいくつかのバックグラウンド クエリ条件のように、より複雑になる場合があります。数十個ある可能性があります。確認するにはどうすればよいですか? ? ?心配しないでください。B サイドとバックエンドの複雑なクエリについては個別に説明します。
実際には、実際のトラフィックのほとんどはユーザー側の C 側から来ているため、基本的にユーザー側の問題は解決されます。この問題はほとんど解決され、残りはマーチャントから来ます。売り手側、B側、バックエンドサポート運用業務 クエリトラフィックはそれほど多くないため、この問題は簡単に解決できます。
もう一方のサイド クエリ
B サイドの非シャーディング キー クエリを解決するには 2 つの方法があります。
二重書き込み. 二重書き込みとは、注文データが2部に保存されることを意味します。C面とB面に1部ずつ保存されます。C面には注文番号が使用できます。ユーザー ID をシャーディング キーとして使用します。B 側は販売者の販売者の ID をシャーディング キーとして使用できます。クラスメイトの中には、二重に書いてもパフォーマンスに影響しないのではないかと言う人もいます。 B サイドではわずかな遅延が許容されるため、非同期メソッドを使用して B サイドの注文を行うことができます。考えてみてください。タオバオで何かを購入して注文した場合、販売者が注文メッセージを受け取るのが 1 ~ 2 秒遅れても問題ありませんか?注文の受け取りが 1 ~ 2 秒遅れることは、注文した持ち帰り販売店に大きな影響を及ぼしますか?
これは解決策です。別の解決策は、 オフライン データ ウェアハウスまたは ES クエリを使用することです。注文データがデータベースにドロップされた後、 binlog または MQ メッセージを使用する場合、メッセージはすべてデータ ウェアハウスまたは ES にデータを同期する形式になっており、この種のクエリ条件ではサポートされる桁数は非常に単純です。この方法では確かにわずかな遅延が発生しますが、この制御可能な遅延は許容範囲です。
データを確認する必要がある運用、ビジネス、製品などの管理バックエンドでのクエリの場合、当然、複雑なクエリ条件が必要になります。これは、次の方法でも実行できます。 ESとかデータウェアハウスとか。このソリューションを使用せず、シャーディング キーを使用せずにページング クエリを実行する場合、テーブル全体をスキャンして集計データをクエリし、手動でページングを実行することしかできませんが、この方法で得られる結果は限られています。
たとえば、256 個のシャードがある場合、クエリを実行するときにすべてのシャードを周期的にスキャンし、各シャードから 20 個のデータを取得し、最後にデータを集計して手動でページングすると、完全な量のデータ。
概要
データベースとテーブルのパーティショニング後のクエリの問題は、経験豊富な学生には実際に知られていますが、ほとんどの学生はまだこの問題に取り組んでいない可能性があると思います。データベースやテーブルについてはまだ構想段階かもしれませんが、面接で質問されても経験がないので何をすればいいのかわからず戸惑っています。
サブデータベースとサブテーブルは、既存の業務量と将来の増加に基づいて最初に判断されます。たとえば、Pinduoduo の 1 日あたりの注文量が 5,000 万件の場合、半年分のデータはスコアは 4096 テーブルですよね。でも、実際の操作は同じです。あなたのビジネスでは、スコアが 4096 である必要はありません。ビジネスに基づいて合理的な選択をしてください。
シャーディングキーに基づくクエリは簡単に解決できます。シャーディングキー以外のクエリは、データの二重コピー、データウェアハウス、ESをドロップすることで解決できます。もちろん、分割後のデータ量が少なければ、、インデックスを作成してテーブル全体をスキャンしてクエリを実行することは問題ありません。
関連する無料学習の推奨事項: mysql ビデオ チュートリアル
以上が数百億のデータがテーブルに分割された後のページング クエリを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック











PHP データベース接続を使用してページング クエリを実装する方法 Web アプリケーションを開発する場合、データベースにクエリを実行してページング表示を実行することがよくあります。一般的に使用されるサーバー側スクリプト言語として、PHP には強力なデータベース接続機能があり、ページング クエリを簡単に実装できます。この記事では、PHP データベース接続を使用してページング クエリを実装する方法を詳しく紹介し、対応するコード例を添付します。データベースの準備 開始する前に、クエリ対象のデータを含むデータベースを準備する必要があります。ここでは MySQL データベースを例として取り上げます。

PHP と PDO: ページ内のデータをクエリして表示する方法 Web アプリケーションを開発する場合、ページ内のデータをクエリして表示することは非常に一般的な要件です。ページングにより、一度に一定量のデータを表示できるため、ページの読み込み速度とユーザー エクスペリエンスが向上します。 PHP では、PHP データ オブジェクト (PDO) ライブラリを使用して、ページング クエリとデータの表示の機能を簡単に実現できます。この記事では、PHP で PDO を使用してページごとにデータをクエリおよび表示する方法と、対応するコード例を紹介します。 1. データベースとデータテーブルを作成する

インターネットの急速な発展に伴い、データ処理はエンタープライズ アプリケーション開発における重要なスキルになりました。 MySQL データベースは、多くのアプリケーションで最も一般的に使用されるデータ ストアの 1 つです。 MySQL では、データ ページング クエリは一般的なデータ取得操作です。この記事では、Go 言語を使用して高パフォーマンスの MySQL データ ページング クエリを実装する方法を紹介します。 1. データページングクエリとは何ですか?データ ページング クエリは、一般的に使用されるデータ取得テクノロジであり、ユーザーは一度にすべてを読み込むことなく、ページ上の少量のデータのみを参照できます。

PHP がページ分割されたクエリに MongoDB を使用する方法の概要: MongoDB は大量のドキュメント データを保存するためによく使用される非リレーショナル データベースですが、PHP は一般的なサーバーサイド スクリプト言語です。この記事では、PHPを使用してMongoDBに接続し、ページングクエリ機能を実装する方法を紹介します。ステップ 1: MongoDB 拡張機能をインストールする. PHP で MongoDB を操作するには、MongoDB 拡張機能をインストールする必要があります。 MongoDB 拡張機能は、次のコマンドを使用してインストールできます。 p

インターネットの急速な発展に伴い、Web アプリケーションの開発はますます複雑になっています。ページング クエリは、Web アプリケーションの一般的な機能の 1 つです。 ThinkPHP6 は、開発者がアプリケーションを迅速に開発できるようにする Web フレームワークです。この記事では、ThinkPHP6 で MySQL を使用してページ分割されたクエリを実行する方法について説明します。まず、ThinkPHP6 でデータベースを作成する必要があります。 MySQL でデータベースを作成するステートメントは次のとおりです。 CREATEDATABASE

PHP および Oracle データベースのページング クエリ手法 動的 Web ページを開発する場合、大量のデータを表示する必要がある場合は、ページング クエリを実行する必要があります。ページ分割されたクエリは、ユーザーが簡単に参照して移動できるように、データを小さなページに分割する手法です。この記事では、PHP と Oracle データベースを使用してページ分割されたクエリを実装する方法について説明し、関連するコード例を示します。 1. 準備 開始する前に、PHP と Oracle データベースがインストールおよび設定されていることを確認する必要があります。まだなら

thinkorm を使用してページング クエリ機能を簡単に実装する方法の概要: Web サイトやアプリケーションを開発する場合、ページ上にデータの一部を表示し、ページめくり機能を提供するために、データベース内のデータに対してページング クエリを実行する必要があることがよくあります。 。この記事では、thinkorm フレームワークを使用してページング クエリ機能を簡単に実装する方法を紹介し、関連するコード例を示します。ステップ 1: thinkorm をインストールする まず、プロジェクトに thinkorm フレームワークをインストールする必要があります。次のコマンドを使用してインストールできます。

最新のアプリケーションでは、ほとんどのデータをページに表示する必要があります。アプリケーションが大量のデータを処理する必要がある場合、サーバーとデータベースに負荷がかかり、クエリに時間がかかるようになります。 Mysql は現在最も人気のあるリレーショナル データベースの 1 つであり、この記事では Mysql ページング クエリのパフォーマンスを最適化する方法について説明します。ページングの原理 最適化を始める前に、まずページングの原理を理解する必要があります。ページング クエリの主な原理は、テーブル データを複数のページに分割し、データを 1 つずつクエリすることです。たとえば、必要な場合は、
