Mysql视图与查询性能

Mysql视图与查询性能,mysql,performance,views,query-optimization,Mysql,Performance,Views,Query Optimization,我有一个基本查询,它使用一个使用另一个视图的视图,如下所示 SELECT a,b,c,DEBIT_AMOUNT, CREDIT_AMOUNT FROM MAIN_VIEW WHERE a='foo' AND c='bar'; 这是模式 create table BASE_TABLE ( id int not null auto_increment, a varchar(20), b varchar(20), c varchar(20), primary key (id)); create t

我有一个基本查询,它使用一个使用另一个视图的视图,如下所示

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

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
我的查询是performance非常慢,为了加快查询执行,我修改了MAIN_视图,如下所示 由于基本表已经在主视图中可用,我想从那时起从那里获取借项金额和贷项金额,而不是进入子视图

--主视图---


但是,经过此修改后,查询性能更差。。有人能帮忙吗?我认为子视图不利于性能…

您需要
索引(id,mtype)
(按任意顺序)。这会使子查询更快,因此整个查询更快。

如果您愿意,请考虑以下简单的两步过程:1。如果您还没有这样做,请提供适当的CREATE和INSERT语句(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。此外,有关查询性能的问题至少需要为所有相关表和解释的结果创建表语句。好的,我已使用架构修改了该问题。。在格式化方面有困难
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