代码之家  ›  专栏  ›  技术社区  ›  pratik

提取数据时性能较慢

  •  2
  • pratik  · 技术社区  · 7 年前

    我的网站运行非常慢,加载数据需要很多时间。 加载数据需要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 回复  |  直到 7 年前
        1
  •  1
  •   O. Jones    7 年前

    假设你最大的桌子是 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的查询计划器可以随机访问索引,以查找与 哪里 语句,然后它可以按顺序读取索引以查找其余匹配行。

    当然,如果你的 哪里 过滤器匹配表中的数千行,页面仍然会变慢;加载、传输和呈现非常大的页面需要时间。

        2
  •  0
  •   Oulalahakabu    7 年前

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

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

    如果你不是

    首先你应该看看 slow queries ,要更改的配置 my.cnf 文件 如果查询速度较慢,则可以通过添加 INDEX 你必须去的地方。您应该使用 EXPLAIN ( documentation )来帮助你做到这一点。 确保已将外键声明为外键( bm.bank_id & e.fk_bank_id - b.bank_ifsc_id & e.fk_bank_ifsc_id ),这将加快查询速度。添加索引,如 e.role_id 我也能做到。

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

        3
  •  0
  •   Rick James diyism    7 年前

    使用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 .

        4
  •  -1
  •   Kyborek    7 年前

    请查看此答案,因为它可能会帮助您: https://stackoverflow.com/a/35757120/1276062

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

    • tblbank\u mst。bank\u id
    • t员工。fk\U银行id
    • TBL银行。bank\u ifsc\u id
    • t员工。fk\U bank\U ifsc\U id
    • t员工。del\U状态
    • t员工。角色\u id
    • t员工。is\U管理员
    • t员工。添加人
    • first\u名称

    如果索引没有帮助,您应该对查询运行EXPLAIN并将结果发布到问题中