Php DataTable服务器端处理大约2500条记录的大数据响应失败
需要在Drupal页面的DataTable中显示大量数据。我使用服务器端处理。php文件返回json数组。它最多可以处理2500条记录(但速度非常慢)。如果超过此值,响应将失败。此外,当我添加一些图标而不是json数组的文本链接(请参见下面的php代码)以便它们显示在客户数据旁边的表中时,DataTable工作的记录量减少到大约800条 这可能是因为json数组的大小吗 如何在DataTable中显示大约5000条记录,并确保它在数据增长时仍能正常工作?如何优化整个过程以加快速度 JavaScript:Php DataTable服务器端处理大约2500条记录的大数据响应失败,php,mysql,Php,Mysql,需要在Drupal页面的DataTable中显示大量数据。我使用服务器端处理。php文件返回json数组。它最多可以处理2500条记录(但速度非常慢)。如果超过此值,响应将失败。此外,当我添加一些图标而不是json数组的文本链接(请参见下面的php代码)以便它们显示在客户数据旁边的表中时,DataTable工作的记录量减少到大约800条 这可能是因为json数组的大小吗 如何在DataTable中显示大约5000条记录,并确保它在数据增长时仍能正常工作?如何优化整个过程以加快速度 JavaScr
var oTable = $('#mytable').DataTable({
ajax: "ajax/myphp.php?i="+i+"&a=",
scrollY: 600,
scroller: {
loadingIndicator: true
},
paging: false
});
下面是myphp.php文件中发生的情况:
<?php
include '../includes/functions/config.php';
include '../includes/functions/functions.php';
if(isset($_GET)){
$i=$_GET['i'];
$a=$_GET['a'];
}
$output= array();
$sql= "Select * from customers where a= $a and i=$i"; //returns about 2600-5500 records depends on the filtering, takes about 0.0010 seconds. If I limit the query to 2500 everything works fine.
/*
get query results
loop thought the result
for each record
- get first, last name, address, phone, email.
- add few links like View, Edit, Payments, Files
- run 2 small functions with a quick db query in each to get things like
balance
*/
$num= mysql_num_rows($data);
while($row= mysql_fetch_assoc($data)){
//do what I mentioned above
$links.= "<a href='edit_customer.php?id=".$row['id']."'>Edit</a> "; //I add about 5 similar links to each record
$output[]= [$row['Last'], $row['First'], $row['Date'],$row['Phone'], $row['Email'], $links];
}
$json_data = array(
"draw" =>1,
"recordsTotal" => $num,
"recordsFiltered" =>$num,
"data" => $output
);
echo json_encode($json_data);
您的问题就在这里,您编写了“运行两个小函数,每个函数中都有一个快速的db查询,以获得平衡之类的结果”
将随后的MySQL调用放入循环中通常是一个坏主意,并且会导致响应时间随着接收的数据量呈指数级增长。相反,您应该尝试在与数据库的单个连接中获取尽可能多的数据,或者最小化数据库调用。使用连接
,您通常可以完成很多工作,大致如下:
SELECT
c.*,
b.*
FROM
customers as c
LEFT OUTER JOIN
balance as b
ON b.customerId = c.id
/* You can also add other join logic in here to control the data coming back */
WHERE
c.a = ?
AND c.i = ?;
每次通过MySQLi运行查询时,都会建立一个新的数据库连接(包括让服务器握手)、传输查询、等待MySQL处理查询、等待MySQL服务器返回数据,然后在继续之前关闭连接。如果对2500条记录结果中的每条记录执行两次,将产生大量开销——从单个脚本建立和关闭5001个连接!在初始查询中加入表可以减少所有额外的开销,并将其恢复到单个数据库调用。你进去,得到你需要的所有数据,然后再出来——这是像MySQL这样的关系数据库真正发光的地方
有关联接表的详细信息,请参见此处:
注意:我切换了参数的直字符串声明。将URL参数直接放入MySQL是一个非常糟糕的想法(TM),因为这会导致所谓的MySQL注入,有人会窃取您的数据并破坏您的数据结构。您的响应中有什么失败?按照以下说明打开php程序中的错误显示。那么请你的问题提供更多信息。提示:您的php语言处理器可能内存不足。mysql.*
函数在过去3年中都没有出现在php中,近10年来一直被弃用。你不应该使用它们。太好了,谢谢!注释掉这两个查询会有所帮助。我将把它们加入到主查询中。我知道直连字符串声明,感谢您以任何方式指出这一点。