3

我有一个站点和一个包含 500 万行的数据库,它的运行就像一个魅力。但是,我每小时运行一次清理 cronjob,将旧数据放入“日志”表并删除旧数据,此时服务器响应非常慢。是否可以通过 PHP 或 MySQL 降低该工作的优先级?

4

5 回答 5

5

我认为清理中最繁重的任务是可以使用 LOW_PRIORITY 的 DELETE 操作。

MySql手册页中的 DELETE 语法:

删除[LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name ...

和描述:

如果您指定LOW_PRIORITY,服务器会延迟 DELETE 的执行,直到没有其他客户端正在从表中读取。这仅影响仅使用表级锁定的存储引擎(例如 MyISAM、MEMORY 和 MERGE)。

于 2011-10-12T17:04:41.787 回答
2

MYSQL 中存在低优先级更新之类的东西 - 它记录在这里 -> http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_low-priority-updates

** 仅适用于 MyISAM、MEMORY、MERGE 存储引擎 ....

于 2011-10-12T16:44:53.823 回答
1

MYSQL 中的低优先级请求之一是INSERT DELAYED。但它仅适用于 INSERT,不适用于 UPDATE 或 DELETE。

编辑:我只知道 DELETE 也可以延迟!

于 2011-10-12T16:49:18.010 回答
1

一种可能的解决方案是在从属复制服务器上复制旧数据。这样一来,重负载就完全在那个从箱上。在从属设备上复制完成后,您可以在主设备上删除。

于 2011-10-12T16:52:00.490 回答
1

文档中所述,您可以添加LOW_PRIORITY到查询中。因此,您的查询将变为:

$sql = "INSERT LOW_PRIORITY INTO #__bet_oddslog (id, team1, team2, league, sport, time, q1, q2)"; $sql .= " SELECT a.id, a.team1, a.team2, a.league, a.sport, a.time, AVG(b.q1) as q1, "; $sql .= " AVG(b.q2) as q2 FROM #__bet_details as a, #__bet_1x2_best as b WHERE time<'".date('Y-m-d H:i:s', strtotime("now"))."' AND a.id=b.bet_id GROUP BY b.bet_id";
于 2011-10-12T17:02:01.873 回答