在PHP中加速MySQL查询
我有一个超过21889464行的表,我正在页面加载上运行其中6个查询在PHP中加速MySQL查询,php,mysql,Php,Mysql,我有一个超过21889464行的表,我正在页面加载上运行其中6个查询 $woReleased = $database->query("SELECT COUNT(*) as Count FROM (select * from workflow where action_name = 'Released' and release_date >= '$startPrevMonth' and release_date <= '$endPrevMonth' AND project_n
$woReleased = $database->query("SELECT COUNT(*) as Count FROM (select * from workflow
where action_name = 'Released'
and release_date >= '$startPrevMonth'
and release_date <= '$endPrevMonth'
AND project_name = 'tims' group by page_id, headline, release_full_name, release_date
) workflow")->fetchAll();
$c_woReleased = $woReleased[0]["Count"];
问题是,当我在PHP中运行6个页面加载时,大约需要14秒才能返回结果
上述查询与其他5个查询之间的唯一区别在于,它们基本上具有不同的action_名称和project_名称
我们将非常感谢您为加快这一进程提供的任何帮助
这是我桌子的结构
我同意Sammitch的评论——准备好的语句才是解决这个问题的方法,缓存确实是如此,但在这种情况下,缓存似乎不是一种选择。此外,通过使用SELECT*可以一次将表中的所有数据拉回来,这将减慢查询速度。你真的需要拉每一列还是你可以更具选择性 使用预先准备好的语句将强制您在返回的列中进行选择。如果您将请求分成两部分,也可能对您有所帮助: 一,。对于第一个查询,只需返回所需的最小值 二,。如果需要查看更详细的样本,则允许用户选择一个或多个包含所需所有详细信息的记录
select page_id
, action_name
, project_name
, headline
, release_full_name
, release_date
, count(*) count
from workflow
where (action_name, project_name) IN((:action_name,:project_name))
and release_date >= :startPrevMonth
and release_date <= :endPrevMonth
group
by action_name
, project_name
, page_id
, headline
, release_full_name
, release_date
在action\u name、release\u date、project\u name的某些组合上建立索引似乎是明智的,尽管我不确定MySQL在以这种方式使用IN时是否可以使用索引,是的,请参阅关于准备好的和绑定的查询1。您好,SQL注入。使用事先准备好的陈述。2.为什么不缓存结果并完全跳过查询呢。这是一个内部应用程序,只有少数非开发者或技术极客使用。我无法缓存结果,因为结果每隔5分钟左右就会不断更改。1。这不是一个正当的借口。2.数字是否需要绝对精确到第二位?如果否,缓存5分钟或更短时间。如果是,。通常,您会启用mysql实例上的慢速日志,以提示每个查询的执行情况。乍一看,您似乎没有索引字段action\u name,这将保证每个查询都需要进行完整的表扫描。我提到过在MySQL中启用慢速登录吗?您可能还需要选择countid。。。或者任何非空的columnt。另外,由于图像不值一个字,所以在显示表结构时,我建议您发出showcreatetabletename命令,并将其粘贴为代码。