我正在尝试从包含数百万条记录的表中获取数据。我的查询基于一些其他表,这些表也导致许多连接。现在,一旦我们执行此查询,它就会挂起数据库并花费太多时间来执行,在此期间,数据库的所有其他操作都会停止工作。
任何人都可以帮助我处理此类查询的最佳方法是什么?
此致
答案 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
}