У меня есть таблица 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
Вам действительно нужно загружать сразу все записи? Я бы рекомендовал вам использовать 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 paginator - это исчерпывающий объем памяти, как есть. Мне уже пришлось увеличить значение по умолчанию memory_limit x4 до 512M и что с тестовой базой данных, которая не так велика, как в реальном времени версия будет.