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 タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

推薦する

泡の小さな鋭角効果を実現するCSS

効果画像(境界線の色が薄すぎるので、{} で囲みます): { }参考リンク Pure CSS バブル...

OpenLayersはポイントフィーチャーレイヤーの集約表示方法を実現します

目次1. はじめに2. ポイントフィーチャーレイヤーの集約3. 重合の特殊処理4. 重合の特殊処理 ...

Linux Cron によるパラメータ付き PHP コードのスケジュール実行

1. 引き続き PHP スクリプトを使用して実行します。コマンドラインに入力: php /home/...

Linux での MySQL 5.7.19 のインストールに関する問題の概要

初めて仮想マシンに MySQL をインストールしたとき、多くの問題が発生しました。ここでそれらを書き...

Web デザインにおける HTML フォーマットと長いファイルに関するヒント

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案、W...

dockerでマウントされたディレクトリが読み書きできない問題を解決する

次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...

MySQLカバーインデックスの利点

一般的な提案は、WHERE 条件のインデックスを作成することですが、これは実際には一方的です。インデ...

HTML に埋め込まれた MP4 形式のビデオが再生できないのはなぜですか?

次のコードは、私の test.html にあります。ビデオは、c:\test.html などの絶対パ...

CSS仕様 BEM CSSとOOCSSサンプルコード詳細説明

序文プロジェクト開発中、各人のコーディング習慣が異なるため、記述された CSS コードは十分に構造化...

MySQL 5.7 における基本的な JSON 操作ガイド

序文プロジェクトのニーズにより、ストレージ フィールドは JSON 形式で保存されます。プロジェクト...

MySQLがフルテーブルスキャンを実行するいくつかの状況

目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...

Dockerオーバーレイはホスト間のコンテナ相互通信を実現します

目次1. Dockerの設定2. レジストリとネットワークを作成する3. コンテナを起動する環境説明...

MySQL 5.7 以降のバージョンのダウンロードとインストールのグラフィック チュートリアル

1. ダウンロード1. MySQL公式サイトのダウンロードアドレス: https://downloa...

MySQLデータベースを操作するためのコマンドラインツールmycliの簡単な紹介

GitHub にはあらゆる種類の魔法のツールがあります。今日、私はデータベースを操作するためのコマン...

Web デザイン TabIndex 要素

TabIndex は、Tab キーを押して、定義された TabIndex 要素を順番に取得し、各要素...