Php DataTable服务器端处理大约2500条记录的大数据响应失败

Php DataTable服务器端处理大约2500条记录的大数据响应失败,php,mysql,Php,Mysql,需要在Drupal页面的DataTable中显示大量数据。我使用服务器端处理。php文件返回json数组。它最多可以处理2500条记录(但速度非常慢)。如果超过此值,响应将失败。此外,当我添加一些图标而不是json数组的文本链接(请参见下面的php代码)以便它们显示在客户数据旁边的表中时,DataTable工作的记录量减少到大约800条 这可能是因为json数组的大小吗 如何在DataTable中显示大约5000条记录,并确保它在数据增长时仍能正常工作?如何优化整个过程以加快速度 JavaScr

需要在Drupal页面的DataTable中显示大量数据。我使用服务器端处理。php文件返回json数组。它最多可以处理2500条记录(但速度非常慢)。如果超过此值,响应将失败。此外,当我添加一些图标而不是json数组的文本链接(请参见下面的php代码)以便它们显示在客户数据旁边的表中时,DataTable工作的记录量减少到大约800条

这可能是因为json数组的大小吗

如何在DataTable中显示大约5000条记录,并确保它在数据增长时仍能正常工作?如何优化整个过程以加快速度

JavaScript:

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年来一直被弃用。你不应该使用它们。太好了,谢谢!注释掉这两个查询会有所帮助。我将把它们加入到主查询中。我知道直连字符串声明,感谢您以任何方式指出这一点。