MySQL 集計統計データの低速クエリの最適化

MySQL 集計統計データの低速クエリの最適化

前面に書かれた

注文テーブル、アクセス記録テーブル、商品テーブルなど、日常生活でデータベースを操作するとき。

データ列の合計やデータ行の数を計算するなどの統計的な問題を頻繁に扱います。

ビジネスが発展するにつれて、これらのテーブルはどんどん大きくなります。適切に処理されない場合、統計のクエリ速度はどんどん遅くなり、ビジネスが耐えられなくなるまで遅くなります。

したがって、まずこれらのシナリオの知識ポイントを理解して検討し、設計の初期段階でビジネス開発をサポートするための最適化スペースを確保する必要があります。

SQL 集計関数

MySQL やその他のデータでは、データの計算を容易にするために集計関数がサポートされています。

以下の方法が一般的です

平均値AVG()を取る
和()
最大値 MAX()
最小値 MIN()
カウント()

いくつかの簡単な SQL ステートメントを示します。

u_id 100の注文の合計数を照会する

u_id = 100 の注文から count(id) を選択します。

u_id 100の注文の合計消費量を照会する

u_id = 100 の注文から sum(order_amount) を選択します。

ベストセラー商品を探す

商品からmax(sell_num)を選択

7月の受注件数と総金額の統計

count(id) を count として選択し、sum(order_amount) を total_amount として選択します。 
order_date が 20190701 から 20190731 の間であり、is_pay = 1 である注文から

この時点で、注文テーブルの総数は1億個になります。この SQL ステートメントの実行速度が非常に遅いのですが、どのようにトラブルシューティングして最適化すればよいでしょうか?

学生の中には、「行数が多いので、日付フィールドにインデックスを追加すれば、スクリーニングが非常に速くなります」と言う人もいるかもしれません。

合計は1億件です。7月に1000万件の注文があると仮定すると、インデックスを追加した後は、スクリーニング速度が当然大幅に向上します。しかし、この時点で私たちの問題は本当に解決したのでしょうか?

この種の集計関数では、各データを走査して結果を計算する必要があります。たとえば、注文の合計数をカウントする場合は、各行の注文金額を読み取って合計する必要があります。

つまり、この統計 SQL では、まず 1 億個のデータから 1,000 万個のデータをフィルタリングし、次にこれらのデータを走査して計算する必要があります。 現時点では非常に遅くなります。

インデックスを追加しても、集計関数の統計処理が遅いという問題は解決されない

集計統計ソリューションの最適化

事前に予算を立てる

20190801 に販売された注文数、金額、その他のデータなど、日付ごとに区切られた統計データ テーブルを作成します。
注文が生成されると(支払い完了後にデータをカウントできます)、統計データテーブルの対応する日付に金額と数量が追加されます。

返金など、データの削減に影響するシナリオがある場合は、それに応じて対処することを忘れないでください。

8 月のデータをカウントする必要がある場合、今月の約 30 行のデータを走査して計算するだけで済みます。

定刻着陸

easyswoole、スケジュールされたタスクなどを使用できます。一定時間(例えば20分ごと)に合計を計算し、統計データテーブルに更新します。

メリット: 処理が少なく、返金操作などの API を変更する必要がありません。元の注文テーブルのデータに依存し、統計データを定期的にカウントして更新するだけで済みます。

異なる注文の人気度に応じて、異なる配信頻度を設定する必要があることに注意してください。たとえば、1 週間以内にデータが変更される可能性が比較的大きい場合は、20 分以内に配信される場合があります。 1 年前のデータは変更される可能性が低いため、1 日に 1 回同期するか、変更されないことが確実な場合は更新しないことも選択できます。

要約する

インデックスは、データの統計的集計のためのSQL文が遅いという問題を解決できない

集計関数は、将来のデータ量を計算するためにスキャンする必要があるデータ行数を見積もることができないため、注意して使用するか、まったく使用しないでください。

最適化計画は統計表と切り離せないものであり、一定期間内に計算された統計データを保存する必要があります。

これで、MySQL 集計統計データのクエリが遅いという記事は終わりです。MySQL 集計統計データのクエリが遅いという記事の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLとPHPの基礎と応用: データクエリ
  • MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論
  • MySQLデータベースの数千万件のデータクエリとストレージの詳細な説明
  • MySQL json 形式のデータクエリ操作
  • MySQL ビッグデータ クエリ最適化エクスペリエンスの共有 (推奨)
  • MySQL と PHP の基礎と応用: データクエリステートメント

<<:  ウェブページ作成時のHTMLタグの使用に注意してください

>>:  Docker でコンテナのポート マッピングを動的に変更する方法

推薦する

Vueのメソッドとプロパティの詳細な説明

Vueのメソッドとプロパティ1. 方法使用法 1メソッド: {メソッド名: function(){}...

C++ TpeScriptシリーズのジェネリックについて

目次1. テンプレート2. ジェネリック3. ジェネリック再帰4. デフォルトのジェネリックパラメー...

CentOS 7.6 への MySQL 5.7 GA バージョンのインストール チュートリアル図

目次環境の準備環境の準備mariadbをアンインストールする rpm -qa | grep mari...

CSS で要素を中央揃えにする N 通りの方法

目次序文インライン要素の中央揃えテキストを垂直に中央揃え要素を水平方向に中央揃えにするブロックレベル...

Linux で NFS のワンクリック展開を実装する方法

サーバー情報管理サーバー: m01 172.16.1.61サーバー: nfs01 172.16.1....

CSS マージンの折りたたみの詳細な説明

前のこれは古くからある古典的な質問です。以前読者から質問があったので、ここでお答えします。簡単な例か...

bash を使って日付をカウントダウンする方法

重要なイベントまであと何日あるか知りたいですか? Linux bash と date コマンドが役に...

Nginx リバース プロキシと負荷分散の実践

リバースプロキシリバースプロキシとは、プロキシサーバーを介してユーザーのアクセス要求を受信し、ユーザ...

大きな MySQL テーブルに列を追加する方法

質問は https://www.zhihu.com/question/440231149 から参照さ...

さまざまなSQL結合を簡単に学ぶ

SQL JOIN 句は、テーブル間の共通フィールドに基づいて 2 つ以上のテーブルの行を結合するため...

Linuxでmore、less、catコマンドを使用してファイルの内容を表示します

Linux では、cat、more、less の各コマンドを使用してファイルの内容を表示できます。c...

ドラッグアンドドロップによる並べ替えの詳細を実現する js

目次1. はじめに2. 実装3. HTML ドラッグ アンド ドロップ API を使用しないのはなぜ...

アリババの中秋節ロゴとウェブサイトのデザインプロセス

<br />まずアイデアを考え、次にスケッチを描き、次にマウスでスケッチし、最後にフラッ...

Linux コマンドラインのクイックヒント: ファイルの検索方法

私たちのコンピューターには、ディレクトリ、写真、ソース コードなどのファイルが保存されています。たく...

Nginx サーバーで Web クローラーをブロックおよび禁止する方法

通常、すべての Web サイトは、多くの非検索エンジン クローラーに遭遇します。これらのクローラーの...