2016-05-20 1 views
-1

私はこのような別のビューを使用するビューを使用する基本クエリを持っています。Mysqlビュー対クエリパフォーマンス

SELECT a,b,c,DEBIT_AMOUNT, CREDIT_AMOUNT FROM MAIN_VIEW WHERE a='foo' AND c='bar'; 

はここで、BASE_TABLEがMAIN_VIEWですでに提供されているので、私はこの ようMAIN_VIEWを変更した

create table BASE_TABLE (
id int not null auto_increment, 
a varchar(20), 
b varchar(20), 
c varchar(20), 
primary key (id)); 

create table OTHER_TABLE (
oid int not null auto_increment, 
id int not null, 
mtype varchar(10), 
amount varchar(20), 
primary key (oid)); 

create or replace view `MAIN_VIEW` AS 
SELECT BT.a, BT.b, BT.c,SUB_VIEW.DEBIT_AMOUNT, SUB_VIEW.CREDIT_AMOUNT 
    FROM BASE_TABLE BT 
    LEFT JOIN SUB_VIEW ON SUB_VIEW.id = BT.id 

create or replace view `SUB_VIEW` AS 
SELECT BT.id, 
     (SELECT SUM(O.amount) 
      FROM OTHER_TABLE O 
      WHERE O.mtype = 'DR' 
       AND O.id = BT.id 
    ) AS DEBIT_AMOUNT, 
     (SELECT SUM(O.amount) 
      FROM OTHER_TABLE O 
      WHERE O.mtype = 'CR' 
       AND O.id = BT.id 
    ) AS CREDIT_AMOUNT 
    FROM BASE_TABLE BT 

私のクエリはpermformanceは、クエリの実行を高速化するために、非常に遅いですスキーマのIむしろSUB_VIEW

に行くよりも、その後、そこからフェッチDEBIT_AMOUNTとCREDIT_AMOUNT思った - MAIN_VIEW ---

create or replace view `MAIN_VIEW` AS 
SELECT BT.a, BT.b, BT.c, 
     (SELECT SUM(O.amount) 
      FROM OTHER_TABLE O 
      WHERE O.mtype = 'DR' 
       AND O.id = BT.id 
    ) AS DEBIT_AMOUNT, 
     (SELECT SUM(O.amount) 
      FROM OTHER_TABLE O 
      WHERE O.mtype = 'CR' 
       AND O.id = BT.id 
    ) AS CREDIT_AMOUNT 
    FROM BASE_TABLE BT 

ただし、この変更後、クエリのパフォーマンスはさらに悪化します..いずれかの助けができますか?サブビューはパフォーマンスに悪いと思った...

+0

この2つの簡単な手順を実行することをお勧めします。1.まだ実行していない場合は、適切なCREATEおよびINSERTステートメント(および/またはsqlfiddle)を提供して、問題をより簡単に複製できるようにします。 2.まだ実行していない場合は、手順1で提供された情報に対応する目的の結果セットを提供します。 – Strawberry

+0

さらに、クエリのパフォーマンスに関する質問では、少なくとも関連するすべてのテーブルのCREATE TABLEステートメントとEXPLAIN。 – Strawberry

+0

さて、私はスキーマで質問を修正しました。 – sam

答えて

0

あなたはINDEX(id, mtype)(いずれかの順序で)が必要です。これによりサブクエリが高速化されるため、クエリ全体が高速化されます。

関連する問題