首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql视图性能优化

sql视图性能优化
EN

Stack Overflow用户
提问于 2014-07-08 13:46:44
回答 2查看 200关注 0票数 2

我有一个观点,它的定义如下

代码语言:javascript
复制
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子句放在视图之外,则查询运行得非常慢。参见下面的示例

代码语言:javascript
复制
select *
from mydashboard 
where

(username  = 'john'
or
DeptIncidentID is null
)
and
CrimeDate = '2014-06-16'

相反,如果我在视图中放置相同的where子句,查询将在2-3秒内非常fast..like地运行。

我的问题是,如果我将where子句放在视图之外,我可以采取哪些步骤使查询快速运行。我在报表中使用这个视图,查询运行得非常慢。

阿瑞夫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-08 16:46:04

MySQL有两个选项来处理在查询中使用的视图:TEMPTABLE

对于MERGE,引用视图和视图定义的语句文本被合并,使得视图定义的部分替换语句的相应部分。 对于TEMPTABLE,视图的结果被检索到一个临时表中,然后临时表用于执行语句。

由于视图定义中的DISTINCT子句,MySQL不能使用MERGE算法。它必须回到效率较低的TEMPTABLE算法。

临时表没有索引,因此必须扫描整个表以处理外部WHERE条件。

您可能希望从视图定义中删除DISTINCT子句,并将其放在外部查询中。

票数 1
EN

Stack Overflow用户

发布于 2014-07-08 13:57:45

这是一个有点长的评论。

MySQL在优化视图方面做得很差。实际上,文档的一个部分启动:

未优化视图处理:

一个可能的问题是,MySQL已经确定视图需要一个临时表。如果是这样的话,所有的处理都需要完成。然后,在最后一个阶段,添加where子句。这里是关于视图的“合并”和“临时表”的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24633522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档