PHP mySql大数据

时间:2014-03-26 01:22:44

标签: php mysql

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

任何人都可以帮助我处理此类查询的最佳方法是什么?

此致

1 个答案:

答案 0 :(得分:0)

如果您使用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
}