【问题标题】:Unable to retrieve bulk records using PHP and MySQL无法使用 PHP 和 MySQL 检索批量记录
【发布时间】:2012-10-11 09:30:24
【问题描述】:

我在 MySQL 中有一个表,结构如下:

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

INDEX appno_index 类型为BTREE 字段app_no

现在这个表有 900000 + 条记录。我正在使用 CodeIgniter 模型列出记录。 我对 CodeIgniter 中记录列表的查询是

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

但是 MySQL 会抛出这样的错误。

致命错误:C:\wamp\www\~\system\database\drivers\mysql\mysql_result.php 第 162 行中允许的内存大小为 134217728 字节已用尽(尝试分配 24 字节)

如何优化我的查询以使页面显示所有记录?

【问题讨论】:

  • 看起来您的 PHP 进程一次只能使用 128 MB 内存。您的 900,000 条记录太大而无法放入内存(据推测,平均记录大小约为 128 字节)。还行吧;没有人会查看所有 900,000 条记录,因此您真的不希望您的页面显示所有 900,000 条记录或 PHP 将所有 900,000 条记录放入内存。如果您认为您确实需要它们,那么您正在设计您的应用程序......次优;数据库应该是您进行查询处理的地方,而不是应用程序。
  • 是的,我当然不想在单个页面上显示 900000 条记录。如果每页显示 50 条记录,那就太酷了。

标签: php mysql codeigniter


【解决方案1】:

单页显示的记录太多了。

考虑改用 CodeIgniter 的 Pagination Library

【讨论】:

  • 谢谢。它有效,但仍在寻找其他替代方案。因为我已经在使用 jquery.dataTable.min.js 进行排序、搜索和分页了。
  • 如果您使用 jQuery DataTables,请使用sAjaxSource parameter.。以这种方式获取内容并提供 JSON。 DataTables 应该能够处理其余的事情。
  • 那没用。我使用了混合解决方案 - 控制器端的 php 分页和视图端的 jquery 分页。
【解决方案2】:

尝试将LIMIT 0 , 30 添加到查询末尾,其中第一个0 是偏移量(从哪里开始获取行),第二个30 是要获取的行数。

【讨论】:

  • 但它只获取 30 条记录。无论是否必须使用分页,我都想显示所有记录。
  • @user1730542 所以你想在一个页面上显示所有 900000+ 行?如果我的计算是正确的,那张表中的 900000 行大约是 223MB 的数据,你必须增加 php 内存大小才能显示所有这些记录,如果它将成为有几个访问者同时访问的实时站点。我建议做多页,LIMIT 0 , 30 第一页,LIMIT 30 , 30 第二页等等。
  • 是的,我可以使用分页。我已经在使用 jquery.dataTables.min.js 来执行搜索分页和排序。但是当查询被触发 SELECT * FROM 时,数据库将返回 900000 条记录,如果我使用限制 0,30,那么它将只显示 30 条记录。要再次指定 LIMIT 30,60,我需要在 CodeIgniter 模型中触发另一个查询,因此对于 900000 条记录,这是不可能的。我正在寻找一种解决方案来优化/修改我的查询,以便它返回 mysql 服务器可以保存并且 jquery 可以显示的数据
  • 当您使用 Jquery 处理这些数量的记录时,在前端呈现需要更多时间。分页应该使用 PHP 或使用 AJAX。
  • @Prasath Ale 当 jquery 已经在进行分页时,我如何在 php 中使用分页?
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多