优化多个MySQL视图的连接

时间:2011-11-17 16:48:34

标签: mysql join views

我的数据库中有多个视图,当某些查询变得非常复杂时,我正在尝试执行JOIN。在最糟糕的情况下,我必须使用以下统计数据加入3次观看:

  • 视图1有60K +行,包含26个字段。
  • 视图2有60K +行,包含15个字段。
  • View 3有80K +行,有8个字段。

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

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

作为最后的手段,我想把一个查询分成两个,点击视图1& 2与第一个查询,然后分别与第3个查看3。除了进行2次查询之外,还有其他不足之处吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您需要使用EXPLAIN来了解效果差的原因。

我不认为你需要担心MyISAM与InnoDB之间的这种特殊读取性能。 MyISAM versus InnoDB

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我将发表评论作为答案:

1)看一下EXPLAIN命令,看看它的内容。

2)检查各个视图的性能。它们和你自己想的一样快吗?

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

  

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

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