运行mySQL查询可以接受多长时间
当我测试这个查询时,大约需要17-20秒才能完成运行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
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