我有一个拥有500万行的网站和数据库,它的工作就像一个魅力。但是,我每小时运行一次清理cronjob,将旧数据放入“日志”表并删除旧数据,此时服务器响应非常慢。是否有可能通过PHP或MySQL将该工作放在较低的优先级?
答案 0 :(得分:5)
我认为清理中最重的任务是DELETE操作,你可以使用LOW_PRIORITY。
从MySql manual page删除语法:
删除 [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name ...
和描述:
如果指定 LOW_PRIORITY ,则服务器会延迟DELETE的执行,直到没有其他客户端从表中读取为止。这仅影响仅使用表级锁定的存储引擎(例如MyISAM,MEMORY和MERGE)。
答案 1 :(得分:2)
在MYSQL中有这样的事情,即低优先级更新 - 在此处记录 - > http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_low-priority-updates
**仅适用于MyISAM,MEMORY,MERGE存储引擎......
答案 2 :(得分:1)
MYSQL中的一个低优先级请求是INSERT DELAYED。但它只适用于INSERT,而不是UPDATE或DELETE。
编辑:我只知道DELETE也可以延迟!答案 3 :(得分:1)
一种可能的解决方案是在从属复制服务器上复制旧数据。这样,重负荷完全在那个奴隶箱上。在slave上完成复制后,您可以在master上删除。
答案 4 :(得分:1)
正如the documentation中所述,您可以在查询中添加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";