优化多个 MySQL 视图的连接

Posted

技术标签:

【中文标题】优化多个 MySQL 视图的连接【英文标题】:Optimizing the Joining of Multiple MySQL Views 【发布时间】:2011-11-17 16:48:34 【问题描述】:

我的数据库中有多个视图,当某些查询变得非常复杂时,我试图对其执行 JOIN。在最坏的情况下,我必须加入 3 个具有以下统计信息的视图:

视图 1 有 60K+ 行和 26 个字段。 视图 2 有 60K+ 行和 15 个字段。 视图 3 有 80K+ 行和 8 个字段。

加入视图 1 和 2 似乎没有问题,但每当我尝试加入第三个视图时,查询就会挂起。我想知道是否应该遵循任何最佳实践来防止这些查询挂起。我尝试使用尽可能小的字段(尽可能使用中/小整数等)。

我们正在使用带有 MyISAM 表的 mysql 5.0.92 社区版。不确定 InnoDB 是否会更高效。

作为最后的手段,我考虑将一个查询分成两个,用第一个查询点击视图 1 和 2,然后用第三个查询分别查看 3。除了进行 2 次查询之外,这还有什么缺点吗?

谢谢。

【问题讨论】:

View 3 只有在加入时才会变慢?当你只查询它时呢?您是否通过在基础表中编入索引的列加入? @FranciscoSoto 所以更深入地看,我注意到在视图 3 的主基础表上,我在两个字段(id_primary、id_company)上有一个主键。我认为这会涵盖我,但根据您的建议,我只为 id_company 添加了一个单独的索引。这实际上完成了查询,尽管对于我的喜欢来说它们仍然需要很长时间(5+ 秒)。谢谢您的帮助!还有其他建议吗? 如果不实际查看查询以及 EXPLAIN 命令告诉您的内容,我认为我无法提出更多建议。 此外,当您仅查询 b 时,包含 (a, b) 列的复合索引(具有多于一列的索引)将无济于事。它对 a 和 a + b 有帮助,但对 b 没有帮助。这就是您添加的单一索引改善这种情况的原因。 【参考方案1】:

您需要使用EXPLAIN 才能了解性能不佳的原因。

我认为您现在不需要担心 MyISAM 与 InnoDB 的这种特殊读取性能。 MyISAM versus InnoDB

【讨论】:

【参考方案2】:

我将发布我的 cmets 作为答案:

1) 看看EXPLAIN 命令,看看它说了什么。

2) 检查各个视图的性能。它们是否像您自己想象的那样快?

3) 您在 WHERE 或 JOIN 子句中使用的列,基础表是否具有适用于它们的索引?需要注意的事项:

具有列的复合索引(具有多于一列的索引) (a, b) 当您仅查询 b 时将无济于事。它有助于一个,和 a + b,但不是只有 b。这就是您添加单个索引的原因 改善情况

4) 您是否使用了所有列和所有视图?如果您不这样做,查看视图并提出查询不是更简单吗?

【讨论】:

【参考方案3】:

如果有可能获得原始 VIEW 的定义方式,那么以此为基础创建您自己的单个查询可能是一种更好的方法……回想起来,另一个人在他们的查询中遇到了类似的问题。他需要回到一个这样的视图的原始表,以确保它有适当的索引来接受他试图执行的查询的优化。请记住,视图是其他事物的子集,并且没有可使用的索引。因此,如果您不能利用视图根表中的索引,您可能会看到这样的性能损失。

【讨论】:

以上是关于优化多个 MySQL 视图的连接的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 MySQL 中的多个左连接?

在日志表上按顺序使用多个连接优化 MySQL 查询以找到最大差异(最佳记录)

跨多个表优化mysql查询

如何优化多表连接视图以获得更快的响应?

条件检查之间的Mysql中有多个条件?有没有办法优化这个查询?

mysql中,如何向测试人员介绍连接查询和子查询的优劣势?