1

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

谢谢大家。

4

2 回答 2

0

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

于 2013-03-22T11:24:16.203 回答
0

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

互联网上没有营业时间之类的东西 - 将有访问者与您的网站互动,希望在一天中的所有时间都试图购买东西;根据我的经验,即使是“国家”网站也往往会在夜间看到流量(尽管与高峰时段相比通常只有很小的速度)。

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

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

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

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

于 2013-03-22T12:10:52.683 回答