获取数据时性能低下
Slow performance while fetching data
我的网站运行速度很慢,加载数据需要很长时间。
加载数据大约需要 2-3 分钟。你能建议我如何让它更快吗?我正在从多个 table 中获取数据。数据库有很多条目将近 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_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
如果索引无法帮助您,您应该 运行 对查询进行解释并将结果 post 放入问题中
如果您尝试一次显示 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
之类的东西上添加索引也可以。
只有你知道在这种情况下要添加哪个索引。
假设最大的 table 是 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
语句匹配的 table 的第一行,然后它可以顺序读取索引以找到其余的匹配行。
当然,如果您的 WHERE
过滤器匹配 table 中的数千行,您的页面仍然会很慢;加载、传输和呈现非常大的页面需要时间。
不要使用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
。
我的网站运行速度很慢,加载数据需要很长时间。 加载数据大约需要 2-3 分钟。你能建议我如何让它更快吗?我正在从多个 table 中获取数据。数据库有很多条目将近 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_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
如果索引无法帮助您,您应该 运行 对查询进行解释并将结果 post 放入问题中
如果您尝试一次显示 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
之类的东西上添加索引也可以。
只有你知道在这种情况下要添加哪个索引。
假设最大的 table 是 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
语句匹配的 table 的第一行,然后它可以顺序读取索引以找到其余的匹配行。
当然,如果您的 WHERE
过滤器匹配 table 中的数千行,您的页面仍然会很慢;加载、传输和呈现非常大的页面需要时间。
不要使用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
。