1

我正在使用zend paginator用於獲取記錄並列出相同的記錄。Zend paginator運行速度很慢1.12

四個連接和我已經索引所有各自的字段,我只獲得所有表中列出的必填字段。總記錄數可能是500萬約。我試圖優化最大和最後我發現這下面的代碼是最好的。

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

但即使這樣,也需要超過40秒加載頁面。有人能幫助我獲得更好的表現嗎?

我會稍微更新我的問題。以下是我的代碼

$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)。然後檢查需要如此長的分頁查詢或計數查詢。順便說一句 - >計數不需要參數,不需要。 – Volvox 2014-11-03 09:25:41

+0

計數查詢需要** 24秒**才能執行。僅供參考,MySQL **發送數據**總共需要30秒才能獲取250萬條記錄。 – 2014-11-04 05:29:36

回答

0

看着你的代碼,我發現你可以改進的東西如下。

  • 不要使用「SELECT * FROM」,只選擇你需要的字段。
  • 視圖的速度比原始查詢快得多。
  • 解釋查詢,以檢查執行時間等

例如:

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); 

希望這有助於!

乾杯!