php mysql最大执行时间为300秒beyond_fatal错误

时间:2012-11-14 17:31:02

标签: php mysql sql phpmyadmin

我正在查询数据库中的数据,查询子句因日期而异。 换句话说,我希望通过计算unix时间戳中的秒数来获取一天单位的数据。

所以,我为一天查询所做的是,

SELECT IDnum, Timestamp FROM table_name
WHERE CONVERT(Timestamp, UNSIGNED INTEGER) >= ($start_tim-86400*($i+1))
  AND CONVERT(Timestamp, UNSIGNED INTEGER) < ($start_time-86400*$i)

因为表中的Timestamp属性是varchar(32),所以我在where子句中使用CONVERT()将其转换为int,并与int类型86400进行比较。

这个查询子句到目前为止工作,但是我设置ini_set('max_execution_time',300)需要至少5分钟。 5分钟后,它显示出来 “致命错误:第90行的C:\ www \ LineChartOne \ generateJSONdata.php超过了420秒的最大执行时间”,但仍未完成。

我的问题是为什么它需要这么多时间,因为我在“where子句”中使用了函数调用?或者“where子句”有问题,否则不应该这么慢。

3 个答案:

答案 0 :(得分:1)

我猜测CONVERT()效率极低。使用UNIX_TIMESTAMP()FROM_UNIXTIME()date functions,例如DATE_SUB()DATE_DIFF()来比较日期。

如果仍然需要永远,那么要么出现问题,而你没有数千万行,那么很可能是:

  1. 您的PHP代码效率低下。
  2. 此查询的内容多于您展示的内容。
  3. 您的网络和/或MySQL服务器负载很重。
  4. 编辑:

    甜蜜的耶稣,你评论中的代码让我的大脑痒。此外,我刚才意识到您的Timestamp列是VARCHAR而不是TIMESTAMP。 糟糕的用户。不要将数字或日期存储为字符串。坐在角落里。

    • 选项1:使其成为INT。 [适用于您现有的代码]
    • 选项2:将其设为DATETIME。 [一般来说更灵活]

    你没有得到的东西:

    1. FROM_UNIXTIME()将整数时间戳转换为DATETIME类型。如果你给它一个字符串,它将进行隐式转换。 [转化]
    2. UNIX_TIMESTAMP()获取日期字符串DATEDATETIME并返回一个整数。
    3. 您提供的代码UNIX_TIMESTAMP(FROM_UNIXTIME(Timestamp))将字符串转换为int,并将日期转换回int。 The documentation is here, read up on it.

      您的查询花费这么长时间的绝大多数原因是因为mySQL必须将Timestamp中的所有值从VARCHAR转换为INTEGER。更改列类型,您可以更快地进行简单的整数比较 worlds

      通过在PHP中预先计算表达式$start_time-86400*($i+1),可以获得更小的性能提升。 mySQL 应该进行优化以仅评估一次,但是当查询变得更复杂并且可能开始为每行计算时,优化器可以做一些时髦的事情。

答案 1 :(得分:0)

mysql查询解析器正在努力转换这些列,你需要为你存储的值使用正确的数据类型,即:int for int,varchar for strings,datetime etc ....

答案 2 :(得分:0)

ini_set('max_execution_time', 300); //300 seconds = 5 minutes

将它放在PHP脚本的顶部,让脚本松开!

取自Increase PHP Script Execution Time Limit Using ini_set()