Огромный MySQL таблица с Zend Framework

0

У меня есть таблица mysql с более чем 4 миллионами данных; хорошо, что проблема заключается в том, что НЕКОТОРЫЕ запросы WORK и НЕКОТОРЫЕ НЕ зависят от условия поиска, если в поисковом терминале имеется большой объем данных в таблице, чем я получаю следующую ошибку:

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 EXPLAIN RESULTS

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 для сгенерированного запроса?
  • 0
    Я также добавил результаты теста EXPLIAN, можете ли вы помочь мне улучшить?
Теги:
zend-framework

2 ответа

7
Лучший ответ

Вам действительно нужно загружать сразу все записи? Я бы рекомендовал вам использовать 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
    чтобы разбить на страницы, ему нужно будет выполнить запрос, который возвращает размер общего набора результатов
  • 0
    Правильно, и это уже реализовано в компоненте Zend_Paginator.
Показать ещё 10 комментариев
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню