0

私は、各URLの訪問を追跡するPHPとMYSQLを使用したURL短縮プロジェクトに取り組んでいます。主にこれらのプロパティで構成される訪問用のテーブルを提供しました:

time_in_second | country | referrer |  os   | browser | device | url_id
#####################################################################
1348128639     |    US   |   direct |  win  | chrome  | mobile | 3404  
1348128654     |    US   |   google | linux | chrome  | desktop| 3404  
1348124567     |    UK   |   twitter| mac   | mozila  | desktop| 3404  
1348127653     |    IND  |   direct | win   | IE      | desktop| 3465  

次に、このテーブルに対してクエリを実行します。たとえば、。を使用してURLの訪問データを取得したいとしurl_id=3404ます。統計を提供してグラフを描画する必要があるため、このURLには次のデータが必要です。

  • このURLの各種類のOSの数。たとえば、20 Windows、15 linux、..。
  • 希望する各期間の訪問数、たとえば過去24時間の10分ごと
  • 各国の訪問数
  • ..。

ご覧のとおり、国などの一部のデータは、さまざまな値を受け入れる場合があります。

私が想像できる良いアイデアの1つは、各列の一意の値の数を出力するクエリを作成することです。たとえば、上記のデータの国の場合、、の列、の列、およびの列にnum_US1つずつ出力します。 num_UKnum_IND

ここで問題となるのは、SQL(MYSQL)でこのような高性能クエリを実装する方法です。

また、これがパフォーマンスの効率的なクエリではないと思う場合、あなたの提案は何ですか?

どんな助けでも深く感謝されます。

更新:この質問を見てください:SQL; 各列で指定された値のみをカウントします。この質問は私のものと似ていると思いますが、違いはcountry property各列で可能な値の多様性にあり(多くの値が可能であるため)、クエリがより複雑になります。

4

3 に答える 3

0

複数のクエリを実行する必要があるようです。おそらく、異なるパラメーターを使用して1つのクエリを作成することもできますが、それでは複雑で保守が困難になります。私は複数の小さなクエリとしてそれにアプローチします。したがって、要件ごとにクエリを作成し、個別にまたは個別に呼び出します。たとえば、あなたが言及した国のクエリが必要な場合は、次のようにすることができます

SELECT country, count (*) FROM <TABLE_NAME> WHERE url_id = 3404 GROUP BY Country

ちなみに、私はこのクエリをテストしていないので、不正確かもしれませんが、これはあなたにアイデアを与えるためだけのものです。これがお役に立てば幸いです。

また、別の提案は、Google Analyticsを使用して調べてみることです。すでに実装しているものがたくさんあり、おそらくそれも役立つでしょう。

乾杯。

于 2012-11-04T16:01:34.990 に答える
0

描画したいこれらのグラフはそれぞれ個別の関係を表しているため、描画したいすべてのグラフに必要なデータを正確に提供する単一のクエリを作成することはできません。

この時点から、あなたの選択は次のとおりです。

  1. グラフごとに異なるクエリを使用する
  2. 大量のデータをクライアントに送信し、必要な後処理を実行して、さまざまなグラフに必要なデータの正確なセットを作成します。
  3. すべてをGoogleAnalytics(a la @ wahab-mirjan)にファームします

オプション2を選択すると、(10分、OS、ブラウザー、デバイス、url_id)タプルあたりのヒット数をカウントすることで、送信するデータの量を最小限に抑えることができます。これは基本的にすべての重複行を削除し、カウントを提供します。クライアントソフトウェアは、これらの数値を取得し、国(またはその他)ごとにさらに減らして、グラフに必要な数値を取得します。正直なところ、あまり利益を得るために、あなたは自分自身に余分な複雑さを買っていると思います。

(サービスを使用する代わりに)自分でこれを行うことを主張する場合は、グラフの種類ごとに異なるクエリを使用してください。いくつかの妥当なインデックスから始めます(url_idとtime_in_secondは明らかな出発点です)。ステートメント(またはデータベースが提供するもの)を使用して、explain各クエリがどのように実行されるかを理解します。

于 2012-11-04T16:13:40.720 に答える
0

申し訳ありませんが、Stack Overflowを初めて使用し、コメントの書式設定に問題があります。これが私の答えです。うまくいけば、今はうまくいきます。

パフォーマンスがどのように悪いのかわからない。私が考えているのは、次のようなテーブルになってしまうということです。

country | count 
################# 
     US | 304 
     UK | 123 
     UK | 23 

したがって、国ごとにグループ化してカウントすると、1つのクエリになります。これで正しい方向に進むことができると思います。いずれにせよ、それは単なる意見なので、別のアプローチを見つけたら、私もそれを知りたいと思っています。

コメントの混乱についてお詫びします。

乾杯

于 2012-11-04T21:10:29.763 に答える