簡體   English   中英

提取數據時性能降低

[英]Slow performance while fetching data

我的網站運行速度非常慢,並且花費大量時間來加載數據。 大約需要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>

假設最大的表是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過濾器與表中的數千行匹配,則您的頁面仍然很慢; 加載,傳輸和呈現非常大的頁面需要花費時間。

如果您試圖一次顯示25000個(或太多)條目:

這很慢,這很正常,您應該對結果進行分頁:使用一些無限滾動插件來顯示相同​​的內容,並限制每個查詢的結果-EDIT:或DataTable分頁選項-

如果不是

首先,您應該看看my.cnf文件中要更改的慢速查詢和配置。 如果查詢速度慢,則可以在需要的地方添加INDEX優化查詢。 您應該使用EXPLAIN文檔 )來幫助您完成此操作。 確保您已將外鍵聲明為外鍵( bm.bank_ide.fk_bank_id - b.bank_ifsc_ide.fk_bank_ifsc_id ),這將加快查詢速度。 e.role_id東西上添加索引也可以做到。

在這種情況下,只有您知道要添加哪個索引。

不要使用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同上。

請查看此答案,因為它可能會對您有所幫助: 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
  • 名字

如果索引無法解決問題,則應對查詢運行EXPLAIN並將結果發布到問題中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM