2016-03-28 15 views
0

DBにuser、log1、log2、log3、log4の5つのテーブルがあります。 各ログには、ユーザーに関するデータ(log1はログインログなど)が保存されます。各ログにはUserIDとCreateTimeとLogIDが列として格納されます。mysqlクエリを最適化する

私は、各ログにこのユーザーIDがある回数を表示する十分な速さのクエリを作成したいと思います。次のようなものです:

select u.UserID, Count(log1.CreateTime) as l1, ... Count(log4.CreateTime) as l4 
from users u left join log1 on log1.UserID = u.UserID left join ... 
group by u.UserID 

問題は、このクエリが時間がかかりすぎるということです。

私のクエリを最適化するのに役立つ人はいますか?このクエリの

+1

クエリの実行計画を見直し、状況が遅い場所を特定します。私の推測では、あなたはどこかのインデックスを必要としています。 –

+0

RDBMSとは何ですか?例えば、SQL Server、MySql –

+0

@HasanBİNBOĞAmysql。 – LordKalmar

答えて

2

select u.UserID, Count(log1.CreateTime) as l1, ... Count(log4.CreateTime) as l4 
from users u left join 
    log1 
    on log1.UserID = u.UserID left join ... 
group by u.UserID 

あなたは「ログイン」表の索引たい:log1(UserId)を、など

しかし、私は、これはあなたが本当に探しているものではないと思います。

  • :これはいくつかの理由で優れている

    select u.*, 
         (select count(*) from log1 where log1.UserID = u.UserID) as log1_cnt, 
         . . . 
    from users u; 
    

    (これは、作成日付/時刻列がNULL決してしないことを前提としています。)

    :同じインデックスを使用すると、相関サブクエリを使用する必要がありますそれは正しいカウントを行います。あなたのバージョンは、4つの列に対して同じ数(または0)を生成します。

  • これは、4つのテーブルのレコードに対して、特定のユーザーに対して中間デカルト積を作成しません。
  • これは外部クエリでgroup byを使用しません。
  • インデックスは、相関サブクエリに使用できます。
0

私は、あなたのログレコードの統計を取得したいと思います。

ログデータベースがあり、1日あたり約1ミロンのレコードを挿入します。統計データベースを作成し、挿入のためにログテーブルにトリガを追加します。そこで、各ログ挿入の統計レコードを更新または挿入します。