Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中加速MySQL查询_Php_Mysql - Fatal编程技术网

在PHP中加速MySQL查询

在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

我有一个超过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_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命令,并将其粘贴为代码。