Огромный MySQL таблица с Zend Framework - PullRequest
0 голосов
/ 31 мая 2010

У меня есть таблица MySQL с более чем 4 миллионами данных; проблема в том, что некоторые запросы работают, а некоторые не зависят от поискового запроса, если поисковый запрос имеет большой объем данных в таблице, чем я получаю следующую ошибку:

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 для метаданных, у меня есть индекс для всех полей этой таблицы. Сайт работает на выделенном сервере с 2 ГБ оперативной памяти.

Я также установил предел памяти: 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 ОБЪЯСНИТЬ РЕЗУЛЬТАТЫ

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

Ответы [ 2 ]

8 голосов
/ 31 мая 2010

Вам действительно нужно загрузить все записи одновременно? Я бы порекомендовал вам использовать 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);
0 голосов
/ 28 ноября 2011

Zend paginator является исчерпывающей памятью как таковой. Мне пришлось увеличить значение memory_limit x4 по умолчанию уже до 512M, и это с тестовой базой данных, которая не так велика, как в конечном итоге будет живая версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...