获取数据时性能下降

时间:2017-12-13 08:34:20

标签: php mysql query-performance

我的网站执行速度非常慢,并且需要花费大量时间来加载数据。 它像加载数据2-3分钟。你能告诉我如何快速完成它吗?我从多个表中获取数据。该数据库有许多条目,近25000个条目。

以下是我目前正在使用的代码。

<table class="table table-striped table-bordered bootstrap-datatable datatable">
<tbody>
  <?php // get all state
     $sql=" SELECT bm.bank_name,b.bank_ifsc,e.emp_id,e.emp_code,
                      e.first_name,e.middle_name,e.last_name,
                      e.active_status as emp_status,
                      e.account_no FROM tblemployee e 
        Left Join tblbank_mst bm  on bm.bank_id=e.fk_bank_id
        Left Join tblbank b  on b.bank_ifsc_id=e.fk_bank_ifsc_id 
        where e.del_status=0
          and e.role_id=4
          and e.is_admin=0 ";
     if($_SESSION["loggedin_role_id"]==2)
     {
     $sql.=" and  e.added_by=".$_SESSION["loggedin_emp_id"];
     }
     $sql.=" order by first_name";

     // echo $sql; exit;

     if(mysql_num_rows($result = mysql_query($sql))>0)
     { 
     while($row = mysql_fetch_array($result))
     { ?>
  <tr>
     <td><?php echo $row['emp_code'];?> </td>
     <td><?php echo $row['first_name'].' '.$row['middle_name'].' '.$row['last_name'];?> </td>
     <td><?php echo $row['bank_name'];?> </td>
     <td><?php echo $row['account_no'];?> </td>
     <td><?php echo $row['bank_ifsc'];?> </td>
     <td class="center">
        <?php if($row['emp_status']==1){ ?>
        <span class="label label-success">Active</span>
        <?php }else{?>
        <span class="label label-danger">Inactive</span>
        <?php }?>
     </td>
     <td class="center">
        <!--<a class="btn btn-success" href="#">
           <i class="halflings-icon white zoom-in"></i>  
           </a>-->
        <?php if($row['approve_status']==0){ ?>
        <a class="btn btn-info" href="edit_employee.php?emp_id=<?php echo $row['emp_id'];;?>">
        <i class="halflings-icon white edit"></i>  
        </a>
        <a class="btn btn-danger" href="#" onClick="ConfirmDelete(<?php echo $row['emp_id'];?>)">
        <i class="halflings-icon white trash"></i> 
        </a>
        <?php }else{ echo "--"; }?>
     </td>
  </tr>

4 个答案:

答案 0 :(得分:1)

假设您的最大表格为tblemployee,请尝试在WHERE子句中提到的三列创建复合索引,即:

 WHERE e.del_status=0 and e.role_id=4 and e.is_admin=0

您可以使用

执行此操作
 CREATE INDEX emp_del_role_admin 
           ON tblemployee
              (del_status, role_id, is_admin);

为什么这有帮助?因为MySQL的查询规划器可以随机访问索引以查找与您的WHERE语句匹配的表的第一行,然后它可以按顺序读取索引以查找其余匹配行。

当然,如果您的WHERE过滤器与表格中的数千行匹配,那么您的页面仍然会很慢;加载,传输和渲染非常大的页面需要时间。

答案 1 :(得分:0)

如果您尝试一次显示25000(或太多)条目:

这很慢并且这是正常的,你应该对结果进行分页:使用一些无限滚动插件来显示相同​​的内容并限制每个查询的结果 -EDIT:或DataTable分页选项 -

如果您不是

首先,您应该查看slow queries,要在my.cnf文件中更改配置。 如果您的查询速度很慢,则可以通过在必要时添加INDEX来优化查询。您应该使用EXPLAINdocumentation)来帮助您这样做。 请确保将外键声明为外键(bm.bank_id&amp; e.fk_bank_id - b.bank_ifsc_id&amp; e.fk_bank_ifsc_id),这样可以加快查询速度。在诸如e.role_id之类的事情上添加索引也可以做到这一点。

在这种情况下,只有你可以知道要添加哪个索引。

答案 2 :(得分:0)

使用PHP的mysql_*接口;切换到mysqli_*或PDO。

添加两个复合索引:

(del_status, role_id, is_admin, first_name)
(del_status, role_id, is_admin, added_by, first_name)

第一个处理您跳过附加AND

的情况

以下模式可能有助于提高性能:更改

... bm.bank_name,
...
    Left Join  tblbank_mst bm  ON bm.bank_id=e.fk_bank_id

... ( SELECT bank_name FROM tblbank_mst WHERE bank_id=e.fk_bank_id
    ) AS bank_name,
...

同样为另一个LEFT JOIN

答案 3 :(得分:-1)

请参阅此答案,因为它可能对您有所帮助: https://stackoverflow.com/a/35757120/1276062

简而言之,你应该检查你是否有关于theese专栏的索引:

  • tblbank_mst.bank_id
  • tblemployee.fk_bank_id
  • tblbank.bank_ifsc_id
  • tblemployee.fk_bank_ifsc_id
  • tblemployee.del_status
  • tblemployee.role_id
  • tblemployee.is_admin
  • tblemployee.added_by
  • 如first_name

如果索引无效,则应对查询运行EXPLAIN并将结果发布到问题