2016-05-26 1 views
0

これはパフォーマンスに関する質問です。msqlクエリまたはmysqlビュー

テーブル名私は、次のMySQLのデータ(同じ構造の1,000以上のレコード)を考えてみましょう:私は労働者の要約と1つのクエリを実行する場合は時間

Employee | Hours | Scope | Project 
John  4  labour  projId_A 
John  3  Travel  projId_A 
Mark  4  labour  projId_A 
Mark  2  Travel  projId_A 

はそれがより良いパフォーマンスですこの

テーブル名を取得するために旅行する人:プロジェクト(私はプロジェクトや時間に参加左ます)

Project | labourHrs | travelHrs 
projId_A  8    5 

または私たちはそれより良い

  1. にのみtravelHrs
  2. を示す図を作成するだけlabourHrs
  3. を示す図を作成することです

その後2つのジョイント・プロジェクトを作成する - > labourHとプロジェクト - > travelH

取得する:

Project | labourHrs | travelHrs 
projId_A  8    5 

私は、私は、プロジェクトのクエリ内またはlabour_view内の和を行うために良いパフォーマンスですか?& travel_view '

何か考えていますか?

+0

私の経験では、VIEWSはパフォーマンスを助けることはありません(他の人が同じクエリのバージョンを悪化させる可能性を減らすことはできません)。また、MySQLが結果をテーブルのように「結合」するだけでなく、ビューが使用されているクエリとそれらの背後にあるクエリを、予測された方法で統合することを試みるため、デバッグが非常に困難になりがちです。 (単純な例: 'SELECT * FROM aTable'クエリをview1と呼ぶビューとして、' SELECT * FROM view1 WHERE id = 1'を実行すると 'aTable'からすべてを選択することはありません。 ) – Uueerdo

答えて

3

それは単一のクエリを行う方が良いです:

select project 
     sum(case when score = 'labour' then hours else 0 end) as labourHrs, 
     sum(case when score = 'travel' then hours else 0 end) as travelhours 
from t 
group by project; 

MySQLでのパフォーマンスの観点からは、ビューは、パフォーマンスは向上しません。パフォーマンスには影響しないかもしれませんが、パフォーマンスは改善されません。

+0

それらを実現することができれば高速ですが、残念ながらMySQLにはこの機能がありません。 – tadman

+0

私はビューを考えている唯一の理由は、私はquickBooksのタイムカードを扱っているので、時間をこのように保つからです:PT3H30M。つまり、数字(3、30)を取得するには、PT、H、Mを部分文字列()にする必要があります。だから、私は "時間"を "PT3H30M"に対処する必要があります。私は、PT3H30Mのサブストリング()のビューを作成して、パフォーマンスに悪影響を及ぼすかどうかを見たいと思っています。それは理にかなっていますか? – user2062455

+0

@ user2062455 。 。単一の列の変換は、ビューでは問題ありません。その列から時間を抽出するビューを自由に定義してください。 –

0

一般的に、データを非表示にしたりクエリを簡略化するためにビューが使用されます。最初のオプションを使用し、最初のSQLでSUMを実行します。