【问题标题】:Mysql View vs Query performanceMysql View vs Query 性能
【发布时间】:2016-05-20 12:23:53
【问题描述】:

我有一个基本查询,它使用一个使用另一个视图的视图,就像这样。

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

我的查询性能很慢,为了加快查询执行速度,我已经像这样修改了 MAIN_VIEW 由于 BASE_TABLE 已经在 MAIN_VIEW 上可用,我想从那时和那里获取 DEBIT_AMOUNT 和 CREDIT_AMOUNT 而不是进入 SUB_VIEW

-- 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

但是经过这个修改后,查询性能更差了..有人可以帮忙吗?我认为子视图不利于性能...

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更容易复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 此外,有关查询性能的问题至少需要针对所有相关表的 CREATE TABLE 语句和 EXPLAIN 的结果。
  • 好的,我已经用架构修改了问题.. 格式化很困难

标签: mysql performance views query-optimization


【解决方案1】:

您需要INDEX(id, mtype)(以任意顺序)。这应该使子查询更快,因此整个查询更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多