Zend Framework的巨大mysql表

Uff*_*ffo 0 php mysql 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
Run Code Online (Sandbox Code Playgroud)

我目前有启用元数据的Zend Framework缓存,我在该表的所有字段上都有索引.该站点在具有2GB内存的专用服务器上运行.

我还将内存限制设置为: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');           
        }
Run Code Online (Sandbox Code Playgroud)

还有其他一些,但它们几乎是一样的.

最好的祝福

// 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;
Run Code Online (Sandbox Code Playgroud)

// 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
Run Code Online (Sandbox Code Playgroud)

nuq*_*qsa 8

你真的需要一次加载所有记录吗?我建议你在这些查询中使用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);
Run Code Online (Sandbox Code Playgroud)