小编mar*_*ite的帖子

处理数百万行时,PDO DELETE意外地变慢

我正在使用一个大约有1200万行的MYISAM表.方法用于删除早于指定日期的所有记录.该表在日期字段上编制索引.在代码中运行时,日志显示当没有要删除的记录时这需要大约13秒,而当有1天的记录时大约需要25秒.当在mysql客户端中运行相同的查询时(在代码运行时从SHOW PROCESSLIST获取查询),它根本没有时间没有记录,一天的记录大约需要16秒.

现实生活中的问题是,当每天运行一次有删除记录时需要花费很长时间,因此更频繁地运行它似乎是合乎逻辑的.但是当我无所事事时,我希望它能尽快退出.

方法提取:

    try {
        $smt = DB::getInstance()->getDbh()->prepare("DELETE FROM " . static::$table . " WHERE dateSent < :date");
        $smt->execute(array(':date' => $date));
        return true;
    } catch (\PDOException $e) {
        // Some logging here removed to ensure a clean test
    }
Run Code Online (Sandbox Code Playgroud)

删除0行时记录结果:

    [debug] ScriptController::actionDeleteHistory() success in 12.82 seconds
Run Code Online (Sandbox Code Playgroud)

mysql客户端当0行删除时:

    mysql> DELETE FROM user_history WHERE dateSent < '2013-05-03 13:41:55';
    Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

1天结果删除时记录结果:

    [debug] ScriptController::actionDeleteHistory() success in 25.48 seconds
Run Code Online (Sandbox Code Playgroud)

mysql客户端1天后删除结果:

    mysql> DELETE FROM user_history WHERE dateSent < '2013-05-05 …
Run Code Online (Sandbox Code Playgroud)

php mysql pdo

19
推荐指数
1
解决办法
936
查看次数

标签 统计

mysql ×1

pdo ×1

php ×1