我正试图从一个表中获得数据,其中有数百万条记录。我的查询是基于其他一些表也导致许多连接。现在,一旦我们执行这个查询,它会挂起数据库,花费太多的时间来执行,在此期间,所有与数据库相关的其他操作都停止工作。
谁能帮我什么是最好的方式来处理这种类型的查询?
对
如果你使用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
}