ログインしたユーザーはいつでも一定期間の新規契約数を確認できます
データベースは mysql です。上位の契約数はすべての部下の契約数の合計であるため、ユーザー
のすべての部下のユーザー ID を再帰的に取得し、から count(*) を使用します。 table where (created_at 期間条件) および created_by in (現在ログインしているユーザー ID を含むすべての下位ユーザー ID)
問題: データは正確ですが、非効率的でサーバーのパフォーマンスに影響します
別のテーブルを使用して各ユーザーの毎日の新規契約数を記録するか、最初にすべての下位ユーザーの ID を取得してから、
select sum (inum) from user_count where (created_at 期間条件) を使用します。
および created_by in (現在ログインしているユーザー ID を含む、すべての下位ユーザー ID)
問題: ユーザーの数が増えると、このフィールドは毎回変更する必要があります。統計は便利ですが、データは不正確です。
当社の Web サイトでは、今日の新規追加、昨日の追加、今週の追加、今月の追加、今四半期の追加、今年の追加をカウントします。ユーザーは独自の期間を入力してクエリを実行することもできます。
何か提案はありますか? ? データを正確かつ統計的に効率化できるソリューション?
新しく追加したコントラクトのコピーを Redis に置き、1 日 1 回クリアすることを検討してください。
オプション 1 が推奨されます。唯一の問題は、すべての部下の人材を再帰的に取得するのに時間がかかることです。それでは、この問題を解決してみましょう!
人事テーブルは次のようなおおよその構造 (典型的なツリー状のデータ ストレージ) を持っていると仮定します。
ID、名前、親ID
Path フィールドを追加します。その値は、
-12-45-765-
などの個人へのアクセス パスです。765 は現在のユーザー ID、45 は 765 の上位です。そして 12 は 45 よりも優れています。-12-45-765-
,其中765是当前用户Id,45是765的上级,12是45的上级。有了这个字段后,根据某个领导的id筛选出他所有的下级以及他自己就易如反掌。
このフィールドを使用すると、リーダーのすべての部下とリーダー自身を ID に基づいて簡単にフィルタリングできます。select id from employee where path like '%-45-%'
パスが '%-45-%' のような従業員から ID を選択
大量のデータがある場合、どのソリューションを使用する場合でも、データを確認するたびにクエリを実行して計算する必要があります。これは非常にストレスがかかります。
この種の場合は、ストリーミング計算統計を直接実行した方がよいでしょう。データを一度計算し、使用するときに直接クエリします。
通常のプロセスのパフォーマンスに影響を与えないように、ストリーミング コンピューティング統計は非同期で操作できます。
私たちのシステムでは、日次統計を見ると過去 90 日間、月次統計を見ると過去 3 年間を確認できます。 3 年前の統計のみを年ごとに表示できます。これは、ストリーム計算統計の小さなコードを書きましたが、1 週間もかかりませんでした。
github.com/panjjo/flysnow もちろん、コードの書き方はまだかなり悪いです。
これはデータベース分野における一般的な OLAP 要件であり、マテリアライズド ビューを考慮することができます。
ご参考までに。
MongoDB が大好きです!楽しむ!
タイマーを書くことで問題は解決します、それだけです! ! !