如何在连接多个视图时优化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;