如何在连接多个视图时优化MySQL子查询?

如何在连接多个视图时优化MySQL子查询?,mysql,sql,database,join,views,Mysql,Sql,Database,Join,Views,假设我有以下两个表 CREATE TABLE `tablea` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `nameA` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `tableb` ( `id` int(11) unsigned NOT NULL AUTO_INCREME

假设我有以下两个表

CREATE TABLE `tablea` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nameA` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE `tableb` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `idA` int(11) unsigned DEFAULT NULL,
  `nameB` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idA` (`idA`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
如果我想有效地连接这两个表,我可以运行这个查询

SELECT * FROM tableA AS a
INNER JOIN tableB AS b ON b.id = a.id
WHERE a.id = 20
假设我不能像上面的例子那样使用
内部连接
,而必须使用这样的子查询

SELECT * FROM tableA AS a
INNER JOIN (
    SELECT * FROM tableB
) AS b ON b.id = a.id
WHERE a.id = 20;
由于子查询是派生查询,MySQL将从
tableB
中提取所有记录,然后从
tableA
中提取1条记录,其中id=20
”,最后将两个数据集连接在一起

如果第二个查询是这样写的,我可以这样调优它“假设我不能使用上面的语法是查询1”

我在这里试图解释的问题是:;假设
tableA
tableB
是一个视图而不是表,每个视图都有一个复杂的查询“许多连接” 我想把a.id=b.ida上的两个视图连接在一起。我无法将
WHERE id=20
子句添加到子查询,因为MySQL不支持子要求“每个查询必须是单个视图”

选择b* 从表a作为 在b.ida=a.id上作为b的内部联接表b

SELECT * FROM viewAll WHERE id = 20;
使用视图时如何优化此查询

我需要告诉MySQL只拉取
id=20的记录,这是由
ON
子句设置的

下面是一个包含表/视图和一些示例数据的
非常感谢您的帮助。

您希望在定义视图时使用
algorithm=MERGE
。如果可以的话,MySQL在优化方面可能会更合理。@GordonLinoff我在子需求上尝试过,但没有帮助。所有视图都应该包含合并算法还是仅包含子要求?@GordonLinoff没有做太多改进。还有其他建议吗。你不会喜欢这个答案的。MySQL确实不能很好地优化视图,所以不要使用它们。我尽量不使用它们,但问题是,我有一个生成自定义属性的系统,所以我希望有一个透视视图,在这里我可以轻松访问自定义属性。这是我需要一个视图的地方,否则每次查询自定义属性都会很疯狂。定义视图时要使用
algorithm=MERGE
。如果可以的话,MySQL在优化方面可能会更合理。@GordonLinoff我在子需求上尝试过,但没有帮助。所有视图都应该包含合并算法还是仅包含子要求?@GordonLinoff没有做太多改进。还有其他建议吗。你不会喜欢这个答案的。MySQL确实不能很好地优化视图,所以不要使用它们。我尽量不使用它们,但问题是,我有一个生成自定义属性的系统,所以我希望有一个透视视图,在这里我可以轻松访问自定义属性。这是我需要一个视图的地方,否则每次查询自定义属性都会很疯狂。定义视图时要使用
algorithm=MERGE
。如果可以的话,MySQL在优化方面可能会更合理。@GordonLinoff我在子需求上尝试过,但没有帮助。所有视图都应该包含合并算法还是仅包含子要求?@GordonLinoff没有做太多改进。还有其他建议吗。你不会喜欢这个答案的。MySQL确实不能很好地优化视图,所以不要使用它们。我尽量不使用它们,但问题是我有一个生成自定义属性的系统,所以我希望有一个透视视图,我可以轻松访问自定义属性。这是我需要的视图,否则每次查询自定义属性都会很疯狂。
CREATE VIEW viewA AS SELECT * FROM tableA;
CREATE VIEW viewB AS SELECT * FROM tableB;
CREATE VIEW viewAll AS
SELECT * FROM viewAll WHERE id = 20;