PHP mySql large data


PHP mySql large data

我正试图从一个表中获得数据,其中有数百万条记录。我的查询是基于其他一些表也导致许多连接。现在,一旦我们执行这个查询,它会挂起数据库,花费太多的时间来执行,在此期间,所有与数据库相关的其他操作都停止工作。

谁能帮我什么是最好的方式来处理这种类型的查询?

如果你使用PDO作为你的MySQL驱动程序,尝试这个类(命名它或重命名它以避免冲突,根据需要):

<?php
class MySQL {
    private $result;
    /**
     * Constructor establishes a database connection via PDO.
     */
    public function __construct($host, $port, $dbname, $username, $password, $sql) {
        try {
            $db = new PDO(
                sprintf( "mysql:host=%s;port=%s;dbname=%s", $host, $port, $dbname ),
                $username,
                $password,
                array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
            );
            $stmt = $db->prepare($sql, array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false));
            $this->result = $db->query($stmt);
        } catch ( PDOException $e ) {
            sprintf("MySQL Connection Error: %s", $e->getMessage()));
        }
    }
    /**
     * Get Next Table Row
     *
     * @return stdClass Get next table row as a stdObject.
     */
    public function next_row() {
        return $this->result->fetchObject();
    }
}

构造函数接受建立连接所需的所有数据库变量,以及用于查询的$sql字符串。选项PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false应该通过不一次将所有结果加载到内存中来防止查询超时。

使用例子:

<?php
$host = "127.0.0.1";
$port = "3306"
$dbname = "mydatabase"
$username = "user"
$password = "l33th@ck3r"
$sql = "SELECT * FROM table WHERE foo='bar'";
$mysql = new MySQL($host, $port, $dbname, $username, $password, $sql);
while ($row = $mysql->next_row()) {
    // do stuff here
}