搜索一个包含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`)))
你语句写错了
怎么写才是对的呢?谢谢
@布泽: 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`))))
这样才能达到你需要的要求
@子明: 改成下面这样了
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秒。
@布泽: 如果说这些表都是必须的,就改内连接吧。这样能快点
@子明:
我试着创建了一个crd_view,把checkrecorddetail和checkrecord用内连接查询出来;
查询count(*) 只花费了2秒。
再创建一个crd2_view,把其它表也left join进来;
查询count(*)却花费了20多秒。
----
使用我最初版本的查询语句,查询count(*)花费了23秒。
@布泽: 2秒钟也多了,为什么会花两秒钟??
@子明:
SELECT
...
FROM
(`checkresultdetail` `crd`
JOIN `checkresult` `cr` ON (((`cr`.`ClassId` = `crd`.`ClassId`)
AND (`cr`.`RouteId` = `crd`.`RouteId`)
AND (`cr`.`CheckDate` = `crd`.`CheckDate`))))
查询耗时:
@子明:
改成下面的语句,又快了些:
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秒。
@子明:
上面的语句写到视图里面会慢一点点。查询count(*)要2秒。
@子明:
在程序里面优化吧。
先把checkrecorddetail和checkrecord的结果查询出来,再根据各个id查询其它信息。