Php 获取数据时性能降低

Php 获取数据时性能降低,php,mysql,query-performance,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

我的网站运行非常慢,加载数据需要很多时间。 加载数据需要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>

活跃的
不活跃的

请查看此答案,因为它可能会帮助您:

简而言之,您应该检查这些列上是否有索引:

  • tblbank\u mst.bank\u id
  • tblemployee.fk_bank_id
  • tblbank.bank\u ifsc\u id
  • tblemployee.fk\u银行\u ifsc\u id
  • tblemployee.del_状态
  • tblemployee.role\u id
  • tblemployee.is_admin
  • tblemployee.added_by
  • 名字

如果索引没有帮助,您应该对查询运行EXPLAIN,并将结果发布到问题中。如果您试图一次显示25000个(或太多)条目:

这是缓慢的,这是正常的,您应该分页您的结果:使用一些无限滚动插件显示相同的东西,并限制每个查询的结果-编辑:或DataTable分页选项-

如果您不是

首先,您应该查看
my.cnf
文件中要更改的配置。 如果查询速度较慢,则可以通过在需要的位置添加
索引来优化查询。您应该使用
EXPLAIN
()来帮助您完成此操作。 确保将外键声明为外键(
bm.bank\u id
&
e.fk\u bank\u id
-
b.bank\u ifsc\u id
&
e.fk\u ifsc\u id
),这将加快查询速度。在
e.role\u id
上添加索引也可以做到这一点


只有您知道在这种情况下要添加哪个索引。

假设最大的表是
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
过滤器与表中的数千行匹配,那么页面仍然会变慢;加载、传输和呈现一个非常大的页面需要时间。

不要使用PHP的
mysql.*
接口;切换到
mysqli.*
或PDO

添加两个复合索引:

(del_status, role_id, is_admin, first_name)
(del_status, role_id, is_admin, added_by, first_name)
第一种方法处理跳过附加的
的情况

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

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


对于另一个
左连接

也一样,您应该将其发布在文章中,而不是在文章中。您是否尝试在查询中运行索引以查看是否缺少索引?您是否对mysql表字段使用index属性?请阅读本文,并特别注意有关查询性能的部分。请您的问题提供更详细的信息。不要使用PHP的
mysql.*
接口。创建许多单列索引通常是有害的,除非选择这些索引来加速特定的查询。此外,在“标志”(或其他基数较低的值)上使用单列索引基本上永远不会被使用。@Kyborek-我已经试着把主要的技巧消化成。这提供了更多提示:@Kyborek-要进行实验,请查找(或创建)一个表,其中索引列的某些值出现在超过(比如)30%的行中。然后执行
EXPLAIN SELECT
,查看索引在“应该”时没有被使用。@Kyborek-为了进一步实验,对
选择
计时,并使用
强制索引(…)
对查询计时。它可能会证明指数会使它变慢。(有许多因素在进行,因此索引可能不会使其变慢。)好吧,该索引可能适用于基本查询,但不适用于附加了
和e.added_by
和/或
order by
的查询。
... ( SELECT bank_name FROM tblbank_mst WHERE bank_id=e.fk_bank_id
    ) AS bank_name,
...