使用我创建的数据库,我可以运行以JSON格式输出数据的搜索查询,然后将它们发送回我的网页。很标准。
$searchQuery = "SELECT * FROM alldata where $searchBy like '%$searchValue%'" ;
$searchResult = mysqli_query($con, $searchQuery);
while ($row = mysqli_fetch_row($searchResult)) {
$item = array();
$item["dateReceived"] = convertDate($row[1]);
$item["quoteCost"] = $row[15];
$item["quoteNumber"] = $row[16];
$item["quoteExpDate"] = convertDate($row[17]);
$item["comments"] = $row[21];
$output[] = $item;
}
$out = array('aaData' => $output);
echo json_encode($out);
当我的查询过于笼统时,某些内容会失败,我不知道它在哪里。
我从服务器获得的响应是:
Fatal error : Allowed memory size of 134217728 bytes exhausted (tried to allocate 14680165 bytes) in C:\xampp\htdocs\....php</b> on line <b>74</b><br />
我的内存限制在php.ini中设置为:
memory_limit=128M
如果我进入mySQL并编写SELECT * FROM
alldata WHERE name like "%a%";
,我会得到大约35,000行,每行约有20列,但它只需要一瞬间。
我可以查询该表的数量非常小 - 我该怎么做才能解决这个问题,以便我的用户可以运行更多通用查询?
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以尝试通过设置
来增加内存memory_limit=256M
或者如果您只将它用于该查询,您也可以进行临时更改
<?php
ini_set('memory_limit', '256M');
当然用您需要的适当数量替换'256M'。 但请务必将其重新设置为之前的状态。您不希望PHP耗尽太多内存。
我还建议96Levels给出答案。使用分页来更有效地管理内存。但是,如果您真的想一次处理所有数据,则需要增加内存大小。
答案 2 :(得分:1)
用户无法在一个页面中同时查看所有35,000行。
这会:
(1)增加脚本的执行时间。
(2)可能会崩溃浏览器试图显示如此多的数据。
为了有效执行脚本,请使用分页和/或限制查询。
答案 3 :(得分:1)
你应该做的第一件事是在你的php.ini中增加php的memory_limit
(搜索memory_limit = 128M
并将其设置为更高的值。不要将值设置为TOO high或者如果脚本的使用效率不高,一些请求将导致使用服务器的所有内存。或者,如果未禁用ini_set函数,则可以使用ini_set('memory_limit', '256M');
动态提高限制(通常托管提供程序禁用所以资源不被滥用)。
在PHP中增加内存限制只会暂时解决您的问题,如果您的数据库正在增长。
您使用查询的方式是糟糕的架构。绝不应该在没有LIMIT的情况下执行查询,尤其是对于大型数据集。
除了提高已经很低的memory_limit
之外,还有一些事情你需要注意。您当前遇到的问题(如果自己执行的查询确实快速返回响应)只是为结果数组/对象及其转换后的字符串分配足够的空间在内存中;然而,其他问题可能会在现在或将来引起这种情况。我可以在这里找出一些帮助你一劳永逸地解决这个问题。
1-在您的请求中添加限制和页面参数,以便您可以对结果进行分页。
2-在MySQL中使用正确的索引来查找您要搜索的字段。如果您正在搜索varchar或文本字段,则最好使用全文索引而不是常规B树索引。 Full-Text Search Functions
3-如果由于某种原因你不能使用全文搜索(例如:你必须使用InnoDB而不是MyISAM),请确保你不使用通配符&#39;%&#39;在字符串的开头,因为它不会正确使用索引(如果使用常规B树索引而不是全文)。
如果您绝对必须使用它,我建议转到全文搜索(如果您想坚持使用MySQL进行搜索而不使用Apache Solr,Sphinx Search或{{等搜索引擎3}}仅举几例。