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

运行mySQL查询可以接受多长时间,mysql,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 GR

当我测试这个查询时,大约需要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秒


感谢大家。

我不在乎,只是确保cron作业不会在进程中途超时。
我个人过去有查询,然后在cron作业中运行了几分钟,没有任何问题。

你说它在cron作业中运行了一夜,你说它支持“站点”——如果这是一个面向公众的网站,是的,你应该担心

互联网上没有营业时间这样的东西——会有访问者与你的网站互动,希望在一天中的任何时间都能买到东西;根据我的经验,即使是“全国性”网站也倾向于通宵查看流量(尽管与高峰时间相比,流量通常只有很小的比率)

您的CRON作业也可能导致其他查询运行缓慢-这取决于是什么导致查询运行缓慢,以及您是否正在使用事务。网站的问题是,当网站运行缓慢时,用户往往会变得不耐烦,刷新页面,通常会给数据库带来更多流量,如果网站上有其他缓慢的查询,那么即使用户数量相当有限,网站也不可能在一段时间内不可用

因此,如果在脚本运行时您的站点可能有用户,那么绝对值得整理一下

您可能担心的另一个原因是,根据我的经验,数据库性能不是线性的——查询的速度不会随着表中记录的数量而线性降低。相反,他们倾向于曲棍球棒一样-一切都很好,直到你达到一个临界点,一切研磨停止。你可能是在玩曲棍球棒曲线,它很容易从17-20秒上升到17-20分钟


修复看起来很简单-group by是冗余的,将查询拆分为较小的查询将有助于子查询选择使用索引。

我建议使用联接,放弃group by(这里没有添加任何内容),并确保在
ex_hotel_temp.hid
ex_dates.hid
上有索引。可以删除
按hid分组
并更改为
选择不同的hid