MySQL テーブル分割後にスムーズにオンラインになる方法

MySQL テーブル分割後にスムーズにオンラインになる方法

表の目的

プロジェクトの開発中に、データベースのデータがどんどん大きくなり、その結果、1 つのテーブルにデータが多すぎる状態になります。その結果、データクエリが遅くなり、テーブルロックメカニズムによりアプリケーション操作が深刻な影響を受け、データベースパフォーマンスのボトルネックが発生します。

このような状況では、テーブルを分割すること、つまり、単一のデータベース テーブルを複数のデータ テーブルに分割することを検討できます。その後、ユーザーがデータにアクセスすると、特定のアルゴリズムに従って異なるテーブルにアクセスできます。このようにして、データは複数のデータ テーブルに分散され、単一のデータ テーブルへのアクセス負荷が軽減されます。データベース アクセス パフォーマンスが向上しました。

例えば

たとえば、最も一般的なユーザーテーブル(ユーザーテーブル)

idユーザーIDその他の分野
主キーIDユーザーIDその他の分野

通常、user_id を使用して対応するユーザー情報をクエリしますが、ビジネスが拡大するにつれて、このテーブルはどんどん大きくなり、数億に達することもあり、クエリのパフォーマンスに重大な影響を与えます。 そこで、クエリの負荷を軽減するために、このテーブルを複数のテーブルに分割します。

テーブル分割戦略

10 個のテーブルを例にとると (具体的なテーブル数は実際の状況に基づいて見積もる必要があります)、最初に user1、user2、user3 の 10 個のテーブルを作成します。 。 。 。 。ユーザー10

通常、モジュロ処理にはインデックス フィールド (user_id) を使用します。テーブルを必要な数だけ分割したい場合は、係数を自由に使用できます。たとえば、この場合は 10 です。

$table_name = $user_id % 10;

上記の係数式によれば

  • 1295のuser_idはuser5になります
  • 8634のuser_idはuser4になります
  • 。 。 。 。 。 。 。

「上記のテーブル検索の戦略に従って、毎回CURDが実行される」、これは大きな問題ではないので、今はこれについては触れません。

すでにオンラインになっている実行中のテーブルはどうすればよいですか?

実際、上記の方法の使い方は誰もが知っているはずですが、問題があります。すでにオンラインになっているテーブルをどうすればいいのでしょうか?そのテーブル内のデータは常にオンラインで検索または変更されています。ユーザーに気付かれずにテーブルをスムーズに分割するにはどうすればよいでしょうか?

方法1

直接オンラインになり、事前にスクリプトを記述します。スクリプトの内容は、古いテーブル(ユーザー)のデータをuser1テーブルとuser10テーブルに同期することです。オンラインになったらすぐに実行します

この方法は、主に以下の問題により、明らかに実現不可能である。

  • 実行中にスクリプトに問題が発生した場合はどうなりますか?すべてのコードをロールバックしますか?
  • スクリプトは、古いテーブル (user) のデータを user1 テーブルと user10 テーブルに同期します。このスクリプトの実行にはどのくらいの時間がかかりますか? 1 時間の場合、この期間中のこのテーブルに関連するオンライン ビジネスは異常です。

これは明らかに機能せず、オンライン コミュニティに大きな影響を与えます。

方法2

まず、データを同期するためのスクリプトを作成します。スクリプトの内容は、古いテーブル (ユーザー) のデータを user1 テーブルと user10 テーブルに同期することです。スクリプトの同期が完了したら、オンラインになります。

この方法はより親切であるように思えますが、いくつか問題もあります。

  • スクリプトが同期されると、すぐにオンラインになります。これら 2 つの間には若干の時間差があります。この時間差の間に、オンライン テーブルに何らかの変更が生じる可能性があります。これらの変更に対して何をすべきでしょうか?

「上記の2つの方法は実行不可能なようですので、別の方法をとらなければならないようです。結論から先にいきましょう。」

ステップ1: デュアル書き込みを開始する

まず、二重書き込みをネット上に載せましょう。これはどういう意味でしょうか?たとえば、user_id=123 の場合、追加、削除、変更操作では、user_id=123 に対応する user テーブルと user3 テーブルの両方を操作します。

function modify($user_id){ //追加、削除、変更操作が含まれます。modify_user(); //ユーザーテーブルを変更します。$table_name = $user_id % 10;
  modify_user($table_name) //対応するサブテーブルを変更する}

クエリはまだユーザー テーブル内にあるため、上記の操作はオンライン ユーザーには影響しません。

ステップ2: 完全同期

ユーザー テーブルを user1-user10 テーブルに完全に同期するスクリプトを作成します。スクリプトがユーザー テーブルのクエリに影響を与える可能性があるため、ピークの少ない期間を見つけてスクリプトを実行するのが最適です。

この手順を実行すると、以前にデュアル書き込みを開始しているため (手順 1 を参照)、ユーザー テーブルと user1-user10 テーブル間のデータは完全に整合します。

ステップ3: 新しいテーブルデータをクエリする

クエリ部分をuser1-user10に変更します

前の 2 つの手順で、ユーザー テーブルと各サブ テーブル間のデータの完全な一貫性が確保されているため、クエリ部分を直接変更しても問題はありません。

上記の手順に従えば、オンラインデータに影響はありません。これが当社のオンライン運用方法です。何度も実践した結果、問題がないことを確認しています。安心してご利用いただけます。

要約する

これで、MySQL テーブル パーティショニングをスムーズに起動する方法についての記事は終了です。MySQL テーブル パーティショニングをスムーズに起動する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLからMariaDBへのスムーズな移行のための詳細な手順
  • Apache、SSL、MySQL、PHPがスムーズかつシームレスにインストールされます
  • 高い同時実行性と大容量データの問題を解決するためのMySQLデータベースのスムーズな拡張の詳細な説明

<<:  優れたユーザー インターフェース デザインのための 37 のヒント (画像付き)

>>:  HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

推薦する

VMware 構成 VMnet8 ネットワーク方法の手順

目次1. はじめに2. 設定手順1. はじめに1. NAT モード (VMnet8) は、仮想マシン...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...

Windows での自動展開に Jenkins を使用するチュートリアル図

今日は、Jenkins + powershell スクリプトを使用して、.NET CORE スクリプ...

InnoDB エンジンのパフォーマンスを最適化するための my.cnf パラメータ構成

私はインターネット上で数え切れないほどの my.cnf 構成を読みましたが、言及されている構成のほと...

MySQL における Datetime と Timestamp の使用の概要

目次1. MySQL で現在の時刻を表現するにはどうすればよいでしょうか? 2. TIMESTAMP...

LeetCode の SQL 実装 (178. スコアランキング)

[LeetCode] 178.ランクスコアスコアをランク付けする SQL クエリを記述します。2 ...

Baidu百科事典UIの開発動向について議論する

<br />百度百科事典の正式版がついにオンラインになりました。2年間の「テスト版」の帽...

Vue のスロットスコープの詳細な理解(初心者向け)

Baidu には slot-scope に関する記事が既にたくさんありますが、以前よく学習しておら...

ファイルが存在するかどうかを判断する JavaScript サンプルコード

1. ビジネスシナリオ最近はファイルのアップロードやダウンロードに関する開発をしています。ダウンロー...

VMware12 で Ubuntu19.04 デスクトップ版をインストールする (インストール チュートリアル)

1. 実験の説明仮想マシンに、 Ubuntu 19.04オペレーティングシステムを手動でインストー...

Linux でローカル コンピューターとリモート サーバーのポートが接続されているかどうかを確認する方法

以下のように表示されます。 1. ssh -v -p [ポート番号] [ユーザー名]@[IPアドレス...

jQueryはテーブルのシームレスなスクロールを実現します

この記事の例では、テーブルのシームレスなスクロールを実現するためのjQueryの具体的なコードを参考...

nginx ip ブラックリストの動的禁止の例

ウェブサイトが悪意を持ってリクエストされた場合、IP アドレスをブラックリストに登録することは重要な...

MySQL で固定されていない位置から文字列要素を抽出する方法

序文注: テストデータベースのバージョンはMySQL 8.0ですテストデータ: テーブルzqs(id...

CentOS7でMySQL 5.7をアンインストールする方法

MySQLに何がインストールされているか確認する rpm -qa | grep -i mysql n...