Php MySQL替换sum(如果(xxx,1,0))
您好,我需要一些帮助来优化这段代码,目前运行SQL查询需要38秒,将其作为视图加载需要23秒。 以下是背景- 当成员使用链接时重定向表记录,记录它们的去向、返回时间和状态。 Projects表管理我需要的每个项目的信息。 目前,我有第三个表,它保存每个项目的计数,每次向redirects表添加记录时都会更新该计数,但是计数可能有点不可靠。服务器每小时运行一次查询以修复/验证计数 有没有什么好方法可以不用sumifxxx,1,0来计算列数Php MySQL替换sum(如果(xxx,1,0)),php,mysql,sql,optimization,Php,Mysql,Sql,Optimization,您好,我需要一些帮助来优化这段代码,目前运行SQL查询需要38秒,将其作为视图加载需要23秒。 以下是背景- 当成员使用链接时重定向表记录,记录它们的去向、返回时间和状态。 Projects表管理我需要的每个项目的信息。 目前,我有第三个表,它保存每个项目的计数,每次向redirects表添加记录时都会更新该计数,但是计数可能有点不可靠。服务器每小时运行一次查询以修复/验证计数 有没有什么好方法可以不用sumifxxx,1,0来计算列数 Select projects.ID as ID,cid,
Select projects.ID as ID,cid,name as name,state as status,
sum(if(status="complete",1,0)) as complete,cpc,
cpc*ss as mmkingaku,
cpc*sum(if(status="complete",1,0)) as total,
sum(if(status="screenout",1,0)) as screenout,
sum(if(status="quotafull",1,0)) as quotafull,
sum(if(status="short",1,0)) as short,
sum(if(status="gate",1,0)) as gate,
sum(if(status is null,1,0)) as empty,
sum(if(status="complete",1,0))/(sum(if(status="complete",1,0))+sum(if(status="screenout",1,0)))*100 as IR
from redirects,projects
where redirects.rid=projects.rid and state<>"test" group by name order by cid desc
SQL性能通常不是由于select子句中的计算。您需要查看from和GROUPBY子句 您的表是否有适当的索引?您应该在redirects.rid、projects.rid或两者上都有索引。事实上,这些可能是复合索引,包括适当的状态和测试
GROUPBY在MySQL中可能是一个性能猪。每个表中有多少数据?数据非常大,重定向表每月获得约20万到30万条记录,但项目仅获得约30条记录。-projects.rid是唯一索引的,redirects.rid是唯一索引的。我现在将索引state,但我在上面的代码中犯了一个错误,而不是在我的服务器上。它应该是statetest在索引后,脚本需要20秒,而不是前面提到的30秒。我猜大部分工作都在group by的文件排序中。您可以使用explain看到这一点。您似乎没有任何可以显著减小数据大小的过滤。如果这一点很重要,您可能需要创建一个汇总表,以便随时了解触发器的最新情况。在不需要额外的表的情况下,是否没有优化可以使这项工作更好?