0

我正在从数据库中查询数据,查询子句随天而变。换句话说,我想通过在 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,并与86400的int类型进行比较。

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

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

4

3 回答 3

1

我猜这CONVERT()是超级低效的。使用UNIX_TIMESTAMP()orFROM_UNIXTIME()date 函数,如DATE_SUB()orDATE_DIFF()来比较日期。

如果它仍然需要很长时间,那么要么出现问题并且您没有数千万行,那么很可能是:

  1. 您的 PHP 代码效率低下。
  2. 此查询比您显示的内容更多。
  3. 您的 Web 和/或 mySQL 服务器承受着来自其他用户的沉重负载。

编辑:

亲爱的耶稣,你评论中的代码让我的大脑发痒。此外,我刚刚意识到您的Timestamp列是 VARCHAR 而不是 TIMESTAMP。坏用户。不要将数字或日期存储为字符串。去角落坐下。

  • 选项 1:将其设为 INT。[适用于您现有的代码]
  • 选项 2:将其设为 DATETIME。[通常更灵活]

你没有得到的东西:

  1. FROM_UNIXTIME()将整数时间戳转换为DATETIME类型。如果你给它一个字符串,它会做一个隐式转换。[转换很]
  2. UNIX_TIMESTAMP()接受一个日期字符串, DATE, orDATETIME并返回一个整数。

您提供的代码UNIX_TIMESTAMP(FROM_UNIXTIME(Timestamp))将字符串转换为 int,将日期转换为 int。文档在这里,请阅读它。

查询需要这么长时间的绝大多数原因是 mySQL 必须将Timestampfrom中的所有值转换VARCHARINTEGER. 更改列类型,您可以进行简单的整数比较,这将更快

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

于 2012-11-14T17:52:44.187 回答
0

mysql 查询解析器正在努力转换这些列,您需要为要存储的值使用正确的数据类型,即:int 表示 int,varchar 表示字符串,datetime 等。

于 2012-11-14T18:57:03.063 回答
0
ini_set('max_execution_time', 300); //300 seconds = 5 minutes

把它放在你的 PHP 脚本的顶部,让你的脚本松散!

取自使用 ini_set() 增加 PHP 脚本执行时间限制

于 2016-02-17T15:30:58.797 回答