1

Я использую zend paginator для получения записей и их же перечисления.Zend paginator работает очень медленно 1.12

Есть четыре соединения, и я проиндексировал все соответствующие поля, и я получаю только обязательные поля для перечисления во всех таблицах. Общее количество записей может быть 5 миллионов прибл. Я попытался оптимизировать максимальный и последний, я нашел, что этот ниже код лучше.

$select = new Zend_Paginator_Adapter_DbSelect($select); 
$select->count($select); 
$paginator = new Zend_Paginator($select); 

Но даже с этим, это занимает больше, чем 40sec для загрузки страницы. Может кто-то помочь мне в повышении производительности.

Я расскажу немного о своем вопросе. ниже мой код

$query = $this->select(); 
$query->setIntegrityCheck(false); 

$query->from(array('test1' => '*'))) 
->join(array('test2' => 'test2'), 'test2.id = test1.test2_id', array('*')) 
->joinLeft(array('test3' => 'test3'), ("test1.test2_id = test3.test2_id'"), array('*') 
->joinLeft(array('test4' => 'test4'), "test1.test4_id = test4.test4_id", array('*')) 
->join(array('test5' => 'test5'), 'test1.test5_id = test5.id', array('*')); 

$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($query)); 

$paginator->setItemCountPerPage(ITEM_PER_PAGE); 
$paginator->setCurrentPageNumber($this->getRequest()->getParam('page', 1)); 
$paginator->setPageRange(PAGE_RANGE); 

$this->view->paginator = $paginator; 
+1

План выполнения был бы приятным (используйте EXPLAIN перед запросом). Затем проверьте, что занимает так долго - запрошенный запрос или запрос подсчета. BTW -> count не принимает параметры и не требуется. – Volvox

+0

Выполнение запроса счетчика ** 24 сек. ** для выполнения. FYI, MySQL ** Отправка данных ** занимает 30 секунд для получения 2,5 миллионов записей. –

ответ

0

Глядя на ваш код, я нашел несколько вещей, которые вы можете улучшить, как показано ниже.

  • Не используйте «SELECT * FROM», выберите только нужные поля.
  • View is намного быстрее, чем необработанные запросы.
  • Объяснить запрос для проверки времени выполнения и т.д.

Например:

CREATE VIEW USER_DATA_VIEW AS 
SELECT 
T1.column1,T1.column2,T1.column3 
T2.column1,T2.column2,T3.column1 
T3.column2,T4.column1,T5.column1 
.... 
FROM test1 as T1 
JOIN test2 as T2 T2.id = T1.test2_id 
LEFT JOIN test3 as T3 T3.id = T1.test3_id 
JOIN test4 as T4 T4.id = T3.test3_id 
JOIN test5 as T5 T5.id = T5.test4_id 

Теперь использовать VIEW для извлечения данных.

SELECT column(s) FROM USER_DATA_VIEW 

Что-то вроде ниже, чтобы получить данные из VIEW, используя предложение LIMIT, а также другой лучший вариант.

$modelObject = new Your_Model_View; 

$select = $this->select(); 
$modelObject->fetchAll($select); 

Надеюсь, это поможет!

Cheers!