MySQL統計データテーブルの設計方法

MySQL統計データテーブルの設計方法

キャッシュ データ テーブルは統計データを収集するときによく使用されるため、統計データとも呼ばれます。たとえば、従業員と部門のデータ テーブルの場合、部門に何人の従業員がいるかを照会する必要がある場合があります。これを実現するには 3 つの方法があります。

  • 部門の従業員数フィールドを追加します。従業員が追加、変更、または削除されるたびに、従業員数を同期的に更新する必要があります (従業員が部門を変更する場合は、複数の部門の従業員数を更新する必要があります)。この方法はリアルタイムのパフォーマンスを保証できますが、非常に非効率的です。操作頻度が低い場合は問題ありませんが、操作頻度が高い場合は、その都度 2 つのテーブルを操作する必要があり、同時に業務コードを処理する必要があり、統計業務と通常業務が深く結びついてしまいます。
  • クエリが実行されるたびに、従業員テーブルから SUM 関数が実行され、部門内の従業員数が取得されます。この方法では、埋もれたポイントを回避できますが、従業員データ テーブルを毎回合計する必要があり、従業員データの量が多い場合は非効率的になります。
  • 従業員テーブルから各部門の人数を定期的に集計する新しい統計テーブルを作成します。固定時間にデータを抽出するこの方法では、リアルタイム性はある程度犠牲になりますが、コードの結合度が減ります。部門がそれほど多くないため、このテーブルのサイズは予測可能であり、データアクセスの効率も向上します。この方法はキャッシュされたデータ テーブルと呼ばれます。

Nuggets のモバイル パーソナル センターを例にとると、各ユーザーのフォロワー数、フォロワー数、Nuggets パワー値を表示するには、各クエリごとに SUM を実行することはできません。つまり、複数のテーブルの合計操作を実行する必要があり、非常に非効率的になります。また、Nuggets パワー値の計算には、より複雑な計算方法 (記事の閲覧数やいいね数に関連) が含まれます。したがって、一般的なテーブル設計を推測することができ、ユーザーの個人ホームページ情報を照会するときに、すべてのデータをこのテーブルから読み取ることができます。

t_user_summay を作成します (
  id INT 主キー、
  ユーザーID BIGINT(20)
  フォーカスされたユーザー数 INT、
  followed_user_cnt INT、
  ユーザー値 INT、
  ユーザーレベル ENUM('Lv1'、'Lv2'、...、'Lv8')、
  created_time 日付時刻、
  updated_time 日付時刻、
);

リアルタイム更新は必要ですか?

実際のアプリケーションでは、統計表を更新する方法は 2 つあります。1 つはリアルタイム更新、もう 1 つはデータの定期的な再構築です。どちらの方法にも長所と短所があります。リアルタイム更新ではクエリ データの即時性が保証されますが、パフォーマンスが犠牲になり、コードの埋め込みが必要になります。また、データの更新が不定期であるため、断片化が発生する可能性があります。データの定期的な再構築は、リアルタイムのパフォーマンスを犠牲にします。データのほとんどが変更されない場合、不要な統計計算につながります。ただし、データが頻繁に変更される場合は、データの定期的な再構築の方が明らかに効率的であり、ポイントが埋もれる状況を回避できます。もちろん、アプリケーションの埋め込みを回避するにはトリガーを使用することもできます。//www.jb51.net/article/213062.htm を参照してください。

マテリアライズド ビュー ツール (Flexviews)

MySQL には、データベース binlog からデータを抽出してデータ統計を完成するために使用される Flexviews と呼ばれるオープン ソース ツールがあります。これはビューに似ていますが、ビューとは異なります。Flexviews によって生成されるデータ テーブルは物理テーブルであるため、マテリアライズド ビューと呼ばれます。さらに、Flexviews は増分更新と完全更新もサポートします。すべての行の統計を再構築する必要がある状況を回避するために、増分更新を使用することをお勧めします。増分更新では、更新を実行する前にどの行が変更されたかをチェックします。これにより、完全更新よりもパフォーマンスが高くなります。ただし、データの変更を検出するには、データ行の変更ログを記録するビューを導入する必要があります。

カウントテーブル

実際の開発では、記事の閲覧数やいいね数などの操作をカウントする必要があることがよくあります。カウント値を同じテーブルに入れると、更新時に同時実行性の問題が発生する可能性が高くなります。別のカウント テーブルを使用すると、クエリ キャッシュの無効化の問題を回避し、より高度なテクニックを有効にできます。たとえば、記事の閲覧数といいね数をカウントするデータ テーブルは次のようになります。

テーブル t_article_counter を作成します (
  article_id INT 主キー、
  read_cnt INT UNSIGNED NOT NULL、
  praise_cnt INT UNSIGNED NOT NULL
);

読み取りカウントを更新するときは、MySQL の組み込み増分操作を使用できます。

更新 t_article_counter 
SET read_cnt = read_cnt + 1
ここで、article_id = 1;

この方法では、操作を単一行にして相互に排他的にすることができるため、トランザクションをシリアル化して同時実行の問題を回避できます。ただし、同時リクエストの数には影響します。同時実行性を高めるために、記事に複数のスロットを追加できます。

テーブル t_article_counter を作成します (
  id INT NOT NULL 主キー、
  スロット TINYINT UNSIGNED、
  記事ID INT、
  read_cnt INT UNSIGNED NOT NULL、
  praise_cnt INT UNSIGNED NOT NULL、
  INDEX(記事ID)
);

このとき、データを初期化するためのスロットを 100 個作成し、更新時に次の操作を実行できます。

更新 t_article_counter
SET read_cnt = read_cnt + 1 
ここで、 slot = RAND() * 100 であり、 article_id = 1 です。

記事の合計読み取り数を取得するには、SUM 演算を使用する必要があります。

SUM(read_cnt) を t_article_counter から選択します
ここで、article_id = 1;

この方法は、実際にはスペースを時間と交換し、同時実行性を高めます。

要約する

この記事では、統計データテーブルの設計方法を紹介します。ポイントは業種にあります。更新頻度が低く、データ量が少ないテーブルの場合は、リアルタイム同期や Direct SUM を使用しても問題ありません。更新頻度の高い大規模なデータ テーブルの場合は、独立した統計テーブルを使用できます。同時に、同時実行性が高い状況では、統計テーブルは各エンティティに複数のスロットを追加して同時実行性を高めることを検討できます。データを定期的に同期する場合は、Flexviews マテリアライズド ビュー プラグインを使用することもできます。

上記は、MySQL で統計データ テーブルを設計する方法の詳細です。MySQL で統計データ テーブルを設計する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • よくある MySQL テーブル設計エラーの概要
  • MySQL データテーブルのパーティション戦略と利点と欠点の分析
  • MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明
  • MySQLでテーブルインデックスを構築する方法
  • MySQL のインデックスとデータ テーブルを管理する方法
  • MySQL のデータ削除とデータ テーブル メソッドの例
  • MySQLでデータテーブルを作成するときにエンジンMyISAM/InnoDBを設定する
  • MySQLテーブルを削除する方法
  • MYSQLについては、データ型と操作テーブルを知る必要があります
  • MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明
  • 重複したMySQLテーブルをマージして削除する簡単な方法

<<:  JavaScript プロトタイプオブジェクトの this ポイント問題の詳細な説明

>>:  docker compose を使用してハーバープライベートウェアハウスをインストールする詳細なチュートリアル

推薦する

CSS スクロールバースタイル変更コード

CSS スクロールバースタイル変更コード .scroll::-webkit-scrollbar { ...

MySQL 5.7.16 無料インストール版のインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 5.7.16のインストールと設定方法を記録します。具体的な内容は以下のとおり...

Linux での mysql8.018 のインストールと設定のプロセスの詳細な説明

Windowsでのインストールの紹介:こちらもご覧ください –》WindowsでのMySQL 8.0...

HTML検証 HTML検証

HTML 検証はHTML 検証を指します。これは、HTML ドキュメントを分析し、標準の HTML ...

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します...

画像をMySQLデータベースに保存し、フロントエンドページに表示するための実装コード

目次1. まず、pycharmを使用してDjangoプロジェクトを作成し、関連する環境を設定します。...

CSS が複数のクラスに一致する方法のサンプルコード

CSSは複数のクラスにマッチする次の HTML タグ li、クラスはオープン スタイルです。私の要件...

Nginx が Apache より優れている理由

Nginx は、わずか数年で Web サーバー市場の大部分を占めるようになりました。周知のとおり、N...

Dockerはコンテナに入るためにnsenterツールを使用する

Dockerコンテナを使用する場合は、nsenterツールを使用する方が便利です。システムにない場合...

Linux echo テキスト処理コマンドの使用法と例

Linux ヘルプ ドキュメントでの echo の説明は、Python や Java などのプログラ...

MySQL マスタースレーブスイッチチャネルの問題の解決策

VIP を設定した後、アクティブ/スタンバイの切り替え中に表示されるエラー メッセージは次のとおりで...

Ubuntu 20.04の新バージョンでルートユーザーを使用してシステムにログインする方法の詳細なチュートリアル

Ubuntu 20.04 では、デフォルトで root ログインが有効になっていないため、デスクトッ...