我有以下定义的观点
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秒内
我的问题是,如果将where子句放在视图外部,可以采取哪些步骤来使查询快速运行。我在报表中使用此视图,查询运行缓慢
关于阿里夫
MySQL有两个选项可以处理在查询中使用的视图:MERGE
或TEMPTABLE
。
对于
MERGE
,将引用视图的语句文本和视图定义合并,以使视图定义的各个部分替换该语句的相应部分。对于
TEMPTABLE
,视图的结果被检索到临时表中,然后该表用于执行该语句。
由于DISTINCT
视图定义中的子句,MySQL无法使用该MERGE
算法。它必须退回效率较低的TEMPTABLE
算法。
临时表没有索引,因此必须扫描整个表以处理外部WHERE
条件。
您可能DISTINCT
要从视图定义中删除该子句,并将其放在外部查询中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句