首页 新闻 会员 周边 捐助

怎么创建视图呢 mysql

0
悬赏园豆:15 [已解决问题] 解决于 2017-01-09 18:02

搜索一个包含5005个记录的视图,用了0.几秒。 

搜索一个30000个记录的视图,用了十几秒

 

请问,怎么解决这个问题呢?

 

问题视图的创建脚本如下:

CREATE
ALGORITHM = UNDEFINED
DEFINER = `root`@`localhost`
SQL SECURITY DEFINER
VIEW `checkresultdetail_view` AS
SELECT
//省略
FROM
(((((`checkresultdetail` `crd`
LEFT JOIN `checkresult` `cr` ON (((`crd`.`ClassId` = `cr`.`ClassId`)
AND (`crd`.`RouteId` = `cr`.`RouteId`)
AND (`crd`.`CheckDate` = `cr`.`CheckDate`))))
LEFT JOIN `patrolrecord` `pr` ON ((`crd`.`RecordId` = `pr`.`id`)))
LEFT JOIN `area` ON ((`crd`.`AreaId` = `area`.`id`)))
LEFT JOIN `route` ON ((`crd`.`RouteId` = `route`.`id`)))
LEFT JOIN `place` ON ((`crd`.`PlaceId` = `place`.`id`)))

问题补充:

将创建视图语句拆分成如下形式也提高不了查询效率:

LEFT JOIN `checkresult` `cr` ON ((`crd`.`ClassId` = `cr`.`ClassId`)))
LEFT JOIN `checkresult` `cr1` ON ((`crd`.`RouteId` = `cr`.`RouteId`)))
LEFT JOIN `checkresult` `cr2` ON ((`crd`.`CheckDate` = `cr`.`CheckDate`)))

快乐的总统95的主页 快乐的总统95 | 老鸟四级 | 园豆:4000
提问于:2017-01-09 16:14
< >
分享
最佳答案
0

你语句写错了

收获园豆:15
子明 | 初学一级 |园豆:109 | 2017-01-09 16:40

怎么写才是对的呢?谢谢 

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 16:41

@布泽: left join后面的and写在where里面SELECT 
//省略
FROM
(((((`checkresultdetail` `crd`
LEFT JOIN `checkresult` `cr` ON (((`crd`.`ClassId` = `cr`.`ClassId`)
LEFT JOIN `patrolrecord` `pr` ON ((`crd`.`RecordId` = `pr`.`id`)))
LEFT JOIN `area` ON ((`crd`.`AreaId` = `area`.`id`)))
LEFT JOIN `route` ON ((`crd`.`RouteId` = `route`.`id`)))
LEFT JOIN `place` ON ((`crd`.`PlaceId` = `place`.`id`)))

where (`crd`.`RouteId` = `cr`.`RouteId`)
AND (`crd`.`CheckDate` = `cr`.`CheckDate`))))

这样才能达到你需要的要求

子明 | 园豆:109 (初学一级) | 2017-01-09 16:45

@子明: 改成下面这样了

SELECT
count(*)
FROM
(((((`checkresultdetail` `crd`
LEFT JOIN `checkresult` `cr` ON ((`crd`.`ClassId` = `cr`.`ClassId`)))
LEFT JOIN `patrolrecord` `pr` ON ((`crd`.`RecordId` = `pr`.`id`)))
LEFT JOIN `area` ON ((`crd`.`AreaId` = `area`.`id`)))
LEFT JOIN `route` ON ((`crd`.`RouteId` = `route`.`id`)))
LEFT JOIN `place` ON ((`crd`.`PlaceId` = `place`.`id`)))
where crd.routeid = cr.routeid and crd.checkdate = cr.checkdate

执行这条查询总数量的语句还是需要21秒,查询limit 0,10也要7秒。

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 16:56

@布泽: 如果说这些表都是必须的,就改内连接吧。这样能快点

子明 | 园豆:109 (初学一级) | 2017-01-09 16:58

@子明: 

我试着创建了一个crd_view,把checkrecorddetail和checkrecord用内连接查询出来;

查询count(*) 只花费了2秒。

再创建一个crd2_view,把其它表也left join进来;

查询count(*)却花费了20多秒。

----

使用我最初版本的查询语句,查询count(*)花费了23秒。

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 17:31

@布泽: 2秒钟也多了,为什么会花两秒钟??

子明 | 园豆:109 (初学一级) | 2017-01-09 17:44

@子明: 

SELECT

...

FROM
(`checkresultdetail` `crd`
JOIN `checkresult` `cr` ON (((`cr`.`ClassId` = `crd`.`ClassId`)
AND (`cr`.`RouteId` = `crd`.`RouteId`)
AND (`cr`.`CheckDate` = `crd`.`CheckDate`))))

查询耗时:

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 17:48

@子明: 

改成下面的语句,又快了些:

SELECT
count(*)
FROM
`checkresultdetail` `crd`
JOIN `checkresult` `cr` ON (`cr`.`ClassId` = `crd`.`ClassId`)
where crd.routeid = cr.routeid and crd.checkdate = cr.checkdate

分别为0.000,1.641秒。

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 17:50

@子明: 

上面的语句写到视图里面会慢一点点。查询count(*)要2秒。

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 17:52

@子明: 

在程序里面优化吧。

先把checkrecorddetail和checkrecord的结果查询出来,再根据各个id查询其它信息。

快乐的总统95 | 园豆:4000 (老鸟四级) | 2017-01-09 18:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册