2012-10-11 114 views
2

我在MySQL與結構的表批量記錄:無法檢索使用PHP和MySQL

id int(10) PRIMARY, 
app_no varchar(255) 

和現場BTREEINDEX appno_index app_no

現在這個表中有900000個+記錄。我使用CodeIgniter模型來列出記錄。 我對記錄在笨上市查詢

$query = $this->db->query("SELECT id, app_no FROM `app_no` USE INDEX(appno_index)"); 

但MySQL的拋出錯誤這樣的。

致命錯誤:用盡134217728個字節允許存儲器大小(試圖分配24個字節)在C:\瓦帕\ WWW \〜\ SYSTEM \數據庫\驅動\的MySQL \ mysql_result.php上線162

如何使用任何東西來優化我的查詢,以便頁面顯示所有記錄?

+1

它看起來像你的PHP進程一次只能使用128 MB的內存。您的900,000條記錄太大而不適合內存(假定平均記錄大小約爲128字節)。還行吧;沒有人會看到所有900,000條記錄,所以你真的不希望你的頁面顯示所有900,000條記錄或PHP將所有900,000條記錄存入內存。如果你認爲你確實需要它們,那麼你正在設計你的應用程序......不是最佳的;該數據庫應該是您查詢處理的地方,而不是應用程序。 –

+0

是的,我不想在單個頁面上顯示900000條記錄。如果每頁顯示50條記錄,那麼它很酷。 –

回答

2

這是太多的記錄顯示在一個頁面上。

請用CodeIgniter的Pagination Library來代替。

+0

謝謝。它的工作原理,但仍在尋找其他的選擇。因爲我已經在使用jquery.dataTable.min.js進行排序,搜索和分頁。 –

+0

如果您使用的是jQuery DataTables,請使用['sAjaxSource'參數。](http://datatables.net/release-datatables/examples/data_sources/ajax.html)。以這種方式獲取內容並提供JSON。 DataTables應該能夠處理其餘的事情。 –

+0

沒有工作。我使用混合解決方案 - 控制器端的php分頁和視圖端的jquery分頁。 –

2

嘗試將LIMIT 0 , 30添加到查詢的末尾,其中第一個0是偏移量(從何處開始提取行),第二個30是要提取的行數。

+0

,但它只提取30條記錄。無論我是否需要使用分頁,我都想顯示所有記錄。 –

+0

@ user1730542所以你想在一個頁面上顯示所有900000 +行?如果我的計算是正確的,那麼表中的900000行大約是223MB的數據,您將不得不增加php內存大小以顯示所有這些記錄,並且如果它將成爲現場與幾個訪客在同一時間訪問。我建議做多頁,第一頁有'LIMIT 0,30',第二頁有'LIMIT 30,30'等等。 – galaxyAbstractor

+0

是的,它的k爲我使用分頁。我已經在使用jquery.dataTables.min.js來執行搜索頁面和排序。但是當查詢被觸發SELECT * FROM時,數據庫將返回900000條記錄,如果我使用限制0,30,那麼它將只顯示30條記錄。要再次指定LIMIT 30,60,我需要在CodeIgniter模型中激發另一個查詢,因此對於900000條記錄是不可能的。我正在尋找一個解決方案,以優化/修改我的查詢,以便它返回的數據,MySQL服務器可以容納和jQuery可以顯示 –