2010-05-30 45 views
0

我有一個MySQL表超過400萬的數據;還有的問題是,一些查詢工作,有的沒有這取決於搜索詞,當檢索詞有數據的比我得到以下錯誤的桌上有一大音量:巨大的MySQL表與Zend框架

Fatal error: Allowed memory size of 1048576000 bytes exhausted (tried to allocate 75 bytes) in /home/****/public_html/Zend/Db/Statement/Pdo.php on line 290 

我現在有啓用了元數據的Zend Framework緩存,我從該表的所有字段都有索引。該站點運行在具有2gb ram的專用服務器上。我還設置了內存限制:ini_set(「memory_limit」,「1000M」);

我可以優化的其他任何東西?

這些是我目前使用的查詢類型:

  $do = $this->select() 
       ->where('branche LIKE ?','%'.mysql_escape_string($branche).'%') 
       ->order('premium DESC'); 

     } 


     //For name 
     if(empty($branche) && empty($plz)) 
     { 
       $do = $this->select("MATCH(`name`) AGAINST ('{$theString}') AS score") 
       ->where('MATCH(`name`) AGAINST(? IN BOOLEAN MODE)', $theString) 
       ->order('premium DESC, score');   
     } 

和其他幾個,但都是大同小異的。

問候

// LE

Zend_Paginator的CODE

 $d = $firmen->doSearch($finalType,$theKeyword,$thePLZ,$theBranche,false,false,false,$theOrder); 
    if ($d !== false) { 
     $paginator = Zend_Paginator::factory($d); 
     $paginator->setItemCountPerPage(5) 
        ->setPageRange(10) 
        ->setCurrentPageNumber($pag); 

     $this->view->data = $paginator; 

// MYSQL EXPLAIN結果

mysql> EXPLAIN select * from `wirtscha_ksw`.`firmen` WHERE `name` LIKE '%gmbh%';ERROR 2006 (HY000): MySQL server has gone away 
No connection. Trying to reconnect... 
Connection id: 32911 
Current database: *** NONE *** 

+----+-------------+--------+------+---------------+------+---------+------+---------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+--------+------+---------------+------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | firmen | ALL | NULL   | NULL | NULL | NULL | 3749155 | Using where | 
+----+-------------+--------+------+---------------+------+---------+------+---------+- ------------+ 
1 row in set (0.03 sec 
+0

您不應該在表中的每一列都需要一個索引,您是否嘗試過對生成的查詢進行EXPLAIN? – robjmills 2010-05-30 21:14:44

+0

我也添加了EXPLIAN測試結果,你能幫助我改進嗎? – Uffo 2010-05-31 11:17:05

回答

7

你真的需要一次加載所有的記錄?我建議你在這些查詢中使用LIMIT。如果您需要提供數據,請考慮使用Zend_Paginator

UPDATE:你正在採取的方法是通過Zend_Paginator所有的結果,這是過度使用大結果集。在這些情況下,更優化的方法是僅傳遞查詢,然後它將負責僅提取顯示頁面所需的數據(這包括計算記錄數並將查詢限制爲每個結果的數量頁),例如:

$paginator = new Zend_Paginator(
    // $query is an instance of Zend_Db_Select 
    new Zend_Paginator_Adapter_DbSelect($query); 
); 
$paginator->setItemCountPerPage(5) 
      ->setPageRange(10) 
      ->setCurrentPageNumber($pag); 
+0

分頁,他需要運行一個查詢返回總結果集的大小 – robjmills 2010-05-30 21:19:19

+0

正確,這已經在Zend_Paginator組件中實現。 – nuqqsa 2010-05-30 21:24:21

+0

特別注意:該問題是由於嘗試將所有數據加載到對象中造成的。這非常耗費資源,因此應該通過限制負載來進行優化,即限制獲取結果的數量。分頁需要首先計算總數結果,因此它包含2個查詢,但是加載的數據量可能會急劇下降。 – nuqqsa 2010-05-30 21:33:39

0

Zend的分頁程序是內存詳盡外的開箱,因爲它是。我必須將默認的memory_limit x4增加到512M,並且這個測試數據庫不像實時版本那麼大。