我的数据库中有多个视图,当某些查询变得非常复杂时,我正在尝试执行JOIN。在最糟糕的情况下,我必须使用以下统计数据加入3次观看:
加入视图1和2似乎没问题,但只要我尝试加入第三个视图,查询就会挂起。我想知道是否有任何最佳实践我应该遵循以防止这些查询挂起。我试图尽可能使用最小的字段(尽可能使用中/小字节等)。
我们正在使用带有MyISAM表的MySQL 5.0.92社区版。不确定InnoDB是否会更有效率。
作为最后的手段,我想把一个查询分成两个,点击视图1& 2与第一个查询,然后分别与第3个查看3。除了进行2次查询之外,还有其他不足之处吗?
感谢。
答案 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)您使用的是所有列和所有视图吗?如果不这样做,那么查看视图并提出查询会更简单吗?