MySQL をデータベースに分割した後にクエリを実行する方法

(*-*)浩
リリース: 2019-06-05 14:35:34
オリジナル
7283 人が閲覧しました

データベースとテーブルを分割する戦略は、プロジェクトの要件によって異なります。ここでは従来のアプローチが採用されています: モジュールの取得方法に従って、2 つの水平分割データベースがあり、各データベースには 2 つの水平分割テーブルがあると仮定します。テーブルの合計数は 4 ですが、デフォルトではクエリ時に他の条件に従って並べ替えられません。41 ページのデータをクエリして、各ページに 10 個のデータを表示するとします。

最初のもの: MySQL をデータベースに分割した後にクエリを実行する方法

も最も単純なものです: 追加の関連付けテーブルを追加することで、属性に id 属性が存在する必要があります。ライブラリ ID 属性があるかどうかについては、テーブル ID 属性 (つまり、どの番号のデータベースとどのテーブル) は、ID に基づいて係数を取得することで取得できるため、オプションです。このテーブルに格納されているデータはすべてのデータですが、属性が少ないことに注意してください。列を作成し、インデックス作成用にいくつかの属性列のみを提供します。この場合、必要なのは * from brand_temp where ... 制限 400,10 (41 ページにデータを挿入し、各ページに 5 個のデータが表示されます) を選択するだけです。 ID を取得したら、対応するテーブルでクエリを実行できます

2 番目のタイプ:

最もパフォーマンスを消費するタイプです。レコードをクエリしたい場合は、最初のページでは、単一のデータベースと単一のテーブルの SQL は次のとおりです: select * from db limit 0, 10; データベースをシャードに分割しても、ステートメントは同じですが、この時点では、メモリ内の 4 つのテーブルから返されたレコードを ID で昇順に実行して、最初の 10 件のデータが返されます... データ量が少ない、ページ番号が小さい場合は問題ありませんが、データをクエリしたい場合2 ページ目、SQL モノリシック アーキテクチャの場合: select * from db limit 10,10; しかし、これは分散データベースでは不可能で、データが非常に小さいため、明らかに失われます。 SQL ステートメントは select * from db_x limit 0,10 10 //これは、クエリする必要があるのは、単一のアーキテクチャ上でクエリするレコードの数に前のレコードを加えたものであることを意味します。すべてのテーブルがメモリ内で結合されて解析され、最後に 10 番目から始まるレコードが取得されます。このソリューションのページ数が n ページに達すると、各ページに表示されるレコードの数が次のようになります。 m、各テーブル クエリする必要があるレコードの数は: (n-1)*m m=nm レコード、メモリ内で解析する必要があるレコードの数は t * n * m レコードです。爆発しない、負ける

3 番目のタイプ:

ビジネス ベースのモデルを採用し、ユーザーにページ ジャンプ クエリを実行できないようにします。これは何を意味しますか? ? ユーザーは、次のページまたは前のページをクリックすることによってのみ参照できます。具体的には、レコード数をクエリして現在の一意の ID 値の最大値を記録し、再度クエリするときに where 条件を追加する方法です。最初から始めましょう: 最初のクエリ pageNum=1, pageSize=10, maxId=0- >sql:select * from db_x where id>0 limit 10; それから、それを対応するライブラリのテーブルに分散し、マージします。取得した4*10個のデータをメモリ上で解析してソートし、最初の10個のデータを取り出し、同時に10個目のデータのid=maxIdを別途取り出してレンダリングして保存するこれにより、次のページをクリックすると、 maxId=10 も送信され、SQL は select * from db_x where id>10 limit 10 になり、解析と保存を続行します。この方法で返されたデータは安定しており、データは一貫性があります (並べ替え)

4 番目:

Legendary 最良の方法は、ページ ジャンプ クエリをサポートすることです。このメソッドは 2 つの SQL クエリにあります。具体的な実行方法: 前提条件: ページ 1001 のデータをクエリし、各ページに 10 レコードを表示します

1):我们先记录下要查询的记录数的范围:(1001-1)*10=10000 开始,10010结束->10000-10010
单体的sql为:select * from db limit 10000,10;
我们总共有4个表,意味着:每个表的start应该为10000/4=2500,从而sql变成了:
select * from db_x limit 2500,10;	//假设是平均分配的,因而我们可以均分,不均分也没关系,后续操作会补齐
我们会得到4个表中的记录:(因为我demo还没写,所以先手写了)
T1:(1,"a"),.......
T2:(2,"b"),.......
T3:(3,"c"),.......
T4:(4,"d"),.......
真实数据第1001页不可能是1开头的,将就着看吧,过几天会一起讲rabbitMQ分布式一致性和这个demo一起发布的
ok,第一阶段的sql查询结束

2):对4个表中返回的记录进行id匹配(id如果非整型,自行用hashCode匹配),因为是升序查询,所以我们只需要比较下每个表的首条记录
的id值即可,获得了最小的minId=1,和各个表最大的那个值maxId;ok,转换sql思路,这里我们采用条件查询了(弥补操作第一步):
select * from db_x where id between minId and maxId 这样我们就获取到了遗漏的数据(当然有多余的数据)
这样我们4个表中就返回了可能记录数各不相同的记录,第二步结束

3):
之后记录minId出现的位置,如T1出现的位置为2500,T2出现的位置为2500-2=2048 ,T3出现的位置为2500-3=2047 ,T4出现的位置
为2500-3=2047 则最终出现的记录数为:2500+2048+2047+2047=10000-2-3-3=9992,因此我们需要的查询的记录数需要从9992 依次往后取
8个开始,然后再取10个就是所求的数据,这种方式能做到数据精确查询,但是唯一的缺点就是每次查询都需要进行二次sql查询
ログイン後にコピー

以上がMySQL をデータベースに分割した後にクエリを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!