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

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

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

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

关于mysql - 运行 mySQL 查询可以接受多长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15568980/

相关文章:

php 脚本命令行 $_POST 参数

mysql - 无法从网络服务器访问 AWS RDS MySQL

php - 通过发布请求将blob图像保存到php中的mysql中

mysql - Node Sequelize with Mysql order by,最后需要空值

mysql - 外键 - 执行表

python - InternalError : (pymysql. err.InternalError) (1193, "Unknown system variable ' transaction_isolation'")

mysql - 主机 'xxx.xx.xxx.xxx' 不允许连接到此 MySQL 服务器

javascript - Mysql OR 语句使用 AJAX 返回数组中的所有行名称值,然后在 Google Maps API V3 中加载多个标记

php - Laravel 播种机偶尔会跳过记录

SQL - 如何转置?