我正在查询数据库中的数据,查询子句因日期而异。 换句话说,我希望通过计算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子句”有问题,否则不应该这么慢。
答案 0 :(得分:1)
我猜测CONVERT()
效率极低。使用UNIX_TIMESTAMP()
或FROM_UNIXTIME()
或date functions,例如DATE_SUB()
或DATE_DIFF()
来比较日期。
如果仍然需要永远,那么要么出现问题,而你没有数千万行,那么很可能是:
甜蜜的耶稣,你评论中的代码让我的大脑痒。此外,我刚才意识到您的Timestamp
列是VARCHAR而不是TIMESTAMP。 糟糕的用户。不要将数字或日期存储为字符串。坐在角落里。
你没有得到的东西:
FROM_UNIXTIME()
将整数时间戳转换为DATETIME
类型。如果你给它一个字符串,它将进行隐式转换。 [转化慢] UNIX_TIMESTAMP()
获取日期字符串DATE
或DATETIME
并返回一个整数。您提供的代码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脚本的顶部,让脚本松开!