2014-03-26 38 views
-1

我想從其中有百萬條記錄的表中獲取數據。我的查詢是基於一些其他表也導致許多聯接。現在,一旦我們執行這個查詢,它會掛起數據庫並花費太多時間來執行,並且在此期間數據庫的所有其他操作停止工作。PHP mySql大數據

任何人都可以幫助我什麼是處理此類查詢的最佳方法?

問候

+0

你有正確的indicies? – TimWolla

+4

向我們顯示查詢和數據庫模式,否則無法回答 – 2014-03-26 01:25:33

+0

嘗試運行以「describe」開頭的查詢,以查看索引是如何使用的以及您可以在哪裏修復它們。 – bitfiddler

回答

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 = "[email protected]" 
$sql = "SELECT * FROM table WHERE foo='bar'"; 
$mysql = new MySQL($host, $port, $dbname, $username, $password, $sql); 

while ($row = $mysql->next_row()) { 
    // do stuff here 
}