我有一个观点,它的定义如下
create view mydashboard as
SELECT distinct
cu.CrimeID,
ad.DeptID,
ad.CrimeDate,
cd.DeptIncidentID,
ad.crime,
u.username
from alldatescrimes ad
inner join crimeslist cl
on
ad.crime = cl.crime
inner join users u
on
u.DeptID = ad.DeptID
left join crimelookup cu
on cu.CrimesListID = cl.CrimeListID
left join crimesdetail cd
on
ad.CrimeDate = cast(cd.CrimeDate as date)
and
ad.DeptID = cd.DeptID
and
cu.CrimeID = cd.CrimeID我的问题是,如果我将where子句放在视图之外,则查询运行得非常慢。参见下面的示例
select *
from mydashboard
where
(username = 'john'
or
DeptIncidentID is null
)
and
CrimeDate = '2014-06-16'相反,如果我在视图中放置相同的where子句,查询将在2-3秒内非常fast..like地运行。
我的问题是,如果我将where子句放在视图之外,我可以采取哪些步骤使查询快速运行。我在报表中使用这个视图,查询运行得非常慢。
阿瑞夫
发布于 2014-07-08 16:46:04
MySQL有两个选项来处理在查询中使用的视图:TEMPTABLE。
对于
MERGE,引用视图和视图定义的语句文本被合并,使得视图定义的部分替换语句的相应部分。 对于TEMPTABLE,视图的结果被检索到一个临时表中,然后临时表用于执行语句。
由于视图定义中的DISTINCT子句,MySQL不能使用MERGE算法。它必须回到效率较低的TEMPTABLE算法。
临时表没有索引,因此必须扫描整个表以处理外部WHERE条件。
您可能希望从视图定义中删除DISTINCT子句,并将其放在外部查询中。
发布于 2014-07-08 13:57:45
这是一个有点长的评论。
MySQL在优化视图方面做得很差。实际上,文档的一个部分启动:
未优化视图处理:
一个可能的问题是,MySQL已经确定视图需要一个临时表。如果是这样的话,所有的处理都需要完成。然后,在最后一个阶段,添加where子句。这里是关于视图的“合并”和“临时表”的更多信息。
https://stackoverflow.com/questions/24633522
复制相似问题