2012-10-11 115 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可以显示 –