[英]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_id
和e.fk_bank_id
- b.bank_ifsc_id
和e.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列上是否有索引:
如果索引無法解決問題,則應對查詢運行EXPLAIN並將結果發布到問題中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.