2013-03-22 31 views
1

当我测试此查询时,大约需要17-20秒才能完成。可以使用多长时间运行mySQL查询

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秒的分数。

感谢所有。

+1

我建议使用联接,放弃'GROUP BY'(它不会在此添加任何内容),并确保'ex_hotel_temp.hid'和'ex_dates.hid'上有索引。 – eggyal 2013-03-22 11:24:31

+0

也许删除'GROUP BY hid'并更改为'SELECT DISTINCT hid' – Justin 2013-03-22 11:34:55

回答

0

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

有没有这样的事情在互联网上营业时间 - 将有游客与您的网站互动,希望尝试购买的东西,在一天的所有时间;即使是“国家”的网站,我也可以看到夜间的交通情况(尽管与高峰时段相比通常只有很小的一部分)。

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

因此,如果有可能是脚本运行时您的网站用户,它绝对值得整理。

您可能担心的另一个原因是,根据我的经验,数据库性能不是线性的 - 查询不会与表中的记录数成线性比例减慢。相反,他们倾向于像曲棍球棒一样 - 一切都很好,直到你到达一个临界点,并且一切都停滞不前。您可能会骑曲棍球曲线,并且可能会从17-20秒轻松升至17-20分钟。

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

0

我不在乎,只要确保cron作业不会在处理过程中暂停一半。 我个人曾经查询过,然后在没有任何问题的情况下在cron作业中运行分钟。