簡體   English   中英

Zend Framework龐大的MySQL表

[英]Huge mysql table with Zend Framework

我有一個超過400萬數據的mysql表; 很好的問題是,某些查詢可以工作,有些則不依賴於搜索項,如果搜索項在表中的數據量很大,那么我將得到以下錯誤:

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代碼

        $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解釋結果

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

您真的需要一次加載所有記錄嗎? 我建議您在這些查詢中使用LIMIT。 如果需要顯示數據,還可以考慮使用Zend_Paginator

更新 :您正在采用的方法是將所有結果傳遞給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);

Zend分頁器是開箱即用的內存。 我必須已經將默認的memory_limit x4增加到512M,並且該測試數據庫的大小不如最終的實時版本大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM