Php 获取数据时性能降低
我的网站运行非常慢,加载数据需要很多时间。 加载数据需要2-3分钟。你能给我建议一下怎么快点吗。我正在从多个表中提取数据。该数据库有许多条目,几乎有25000个条目 下面是我目前使用的代码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
<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,
...