运行mySQL查询可以接受多长时间

时间:2013-03-22 11:15:40

标签: mysql

当我测试此查询时,需要大约17到20秒才能完成。

    UPDATE ex_hotel_temp
SET specialoffer='1'
WHERE hid IN
    (SELECT hid
     FROM ex_dates
     WHERE offer_id IS NOT NULL
       OR xfory_id IS NOT NULL
       OR long_id IS NOT NULL
       OR early_id IS NOT NULL
     GROUP BY hid)

虽然这是一个夜间运行的cronjob在数据库上做一些内务处理(没有站点访问者等待结果),但在我看来,这对服务器来说是一个不可接受的负载。我是对的,还是我无所事事?

当我单独运行查询的每个元素时,大约需要0.001秒。因此,我应该将其分解为一系列简单的查询吗?

稍后编辑: 在收到的评论和答案的帮助下,我决定将查询分成两部分。结果如下:

$query_hotel = "SELECT hid FROM ex_dates WHERE offer_id IS NOT NULL OR xfory_id IS NOT NULL OR long_id IS NOT NULL OR early_id IS NOT NULL GROUP BY hid";
$hotel = mysql_query($query_hotel, $MySQL_XXX) or die(mysql_error());
$row_hotel = mysql_fetch_assoc($hotel);
$totalRows_hotel = mysql_num_rows($hotel);

$hid_array = array();
do {
    array_push($hid_array,$row_hotel['hid']);
}while ($row_hotel = mysql_fetch_assoc($hotel)) ;
$hid_list = implode("','",$hid_array);
$hid_list = "'$hid_list'";

// Mark the hotels as having a special offer 
$query_update = "UPDATE ex_hotel_temp SET specialoffer='1' WHERE hid IN ($hid_list)";
$result = mysql_query($query_update, $MySQL_XXX) or die(mysql_error());

它不漂亮,但它有效。

由于存在两个带有一点PHP的查询,我无法准确测量运行所需的时间,但只是通过查看页面加载它的时间显然更接近于一秒钟的分数超过20秒。

感谢所有人。

2 个答案:

答案 0 :(得分:0)

我不在乎,只是确保cron作业不会在进程中途超时。 我个人过去曾经有过查询,然后在没有任何问题的情况下在cron工作中跑了几分钟。

答案 1 :(得分:0)

你说这是在CRON工作中一夜之间运行的,你说这支持“网站” - 如果这是一个面向公众的网站,是的,你应该担心。

互联网上没有营业时间这样的事情 - 会有访客与您的网站互动,希望在一天中的所有时间都尝试购买东西;根据我的经验,即使是“国家”网站也会看到夜间交通(尽管与高峰时段相比通常只有很小的比率)。

你的CRON作业可能导致其他查询运行缓慢 - 这取决于导致查询运行缓慢的原因,以及你是否正在使用事务。网站的问题是,当网站速度缓慢,刷新页面,经常为数据库创建更多流量时,用户往往会感到不耐烦,如果网站上有其他慢查询,则网站不可能无法使用一段时间,即使用户数量相当有限。

因此,如果在脚本运行时可能成为您网站的用户,那么绝对值得整理。

您可能担心的另一个原因是,根据我的经验,数据库性能不是线性的 - 查询不会与表中的记录数成线性比例减慢。相反,它们往往像曲棍球棒一样 - 一切都很好,直到你达到临界点,一切都停止了。你可能会骑曲棍球曲线,它很容易从17-20秒升级到17-20分钟。

修复看起来很简单 - group by是多余的,将查询拆分成较小的查询应该有助于subselect使用索引。