优化多个MySQL视图的连接

优化多个MySQL视图的连接,mysql,join,views,Mysql,Join,Views,我的数据库中有多个视图,当某些查询变得非常复杂时,我会尝试对这些视图执行连接。最糟糕的情况是,我必须加入3个具有以下统计信息的视图: 视图1有60K+行,包含26个字段 视图2有60K+行和15个字段 视图3有80K+行和8个字段 连接视图1和视图2似乎没有问题,但只要我尝试连接第三个视图,查询就会挂起。我想知道是否有什么最佳实践我应该遵循,以防止这些质疑挂起。我尝试使用尽可能小的字段(尽可能使用中/小整数等) 我们将MySQL 5.0.92社区版与MyISAM表一起使用。不确定InnoDB

我的数据库中有多个视图,当某些查询变得非常复杂时,我会尝试对这些视图执行连接。最糟糕的情况是,我必须加入3个具有以下统计信息的视图:

  • 视图1有60K+行,包含26个字段
  • 视图2有60K+行和15个字段
  • 视图3有80K+行和8个字段
连接视图1和视图2似乎没有问题,但只要我尝试连接第三个视图,查询就会挂起。我想知道是否有什么最佳实践我应该遵循,以防止这些质疑挂起。我尝试使用尽可能小的字段(尽可能使用中/小整数等)

我们将MySQL 5.0.92社区版与MyISAM表一起使用。不确定InnoDB是否会更高效

作为最后的手段,我考虑将一个查询拆分为两个,用第一个查询点击视图1和2,然后用第三个查询分别点击视图3。除了提出两个问题之外,这还有什么缺点吗

谢谢。

您需要使用来了解性能差的原因


我认为您还不必担心MyISAM与InnoDB之间的这种特殊读取性能

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

我将发表我的评论作为答案:

1) 看看这个命令,看看它说了些什么

2) 检查各个视图的性能。他们的速度是否和你想象的一样快

3) 在WHERE或JOIN子句中使用的列,基础表是否具有应用于它们的索引?要记住的是:

包含列的复合索引(包含多个列的索引) (a,b)在您仅查询b时没有帮助。它有助于解决问题,而且 a+b,但不仅仅是b。这就是为什么要添加单个索引 改善了情况


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

视图3只是在您加入它时变慢了吗?如果你只查询它呢?您是通过在基础表中索引的列加入的吗?@franciscosto因此,我在视图3的主要基础表中发现,我在两个字段(id_primary,id_company)上有一个主键。我原以为这就涵盖了我,但根据你的建议,我在just id_company中添加了一个单独的索引。这实际上已经完成了查询,尽管它们对我的喜好来说仍然需要太长的时间(5秒以上)。谢谢你的帮助!还有其他建议吗?我认为如果不实际查看查询以及EXPLAIN命令告诉您的内容,我无法提出更多建议。此外,如果您只查询b,则包含(a,b)列的复合索引(一个包含多个列的索引)也不会有帮助。它有助于a和a+b,但不仅仅是b。这就是为什么您添加的单一索引改善了这种情况。