我需要优化一个查询。脚本返回如下所示的简单表结果。
我想加速结果,也许有一种解决方案是将montly查询合并为一个。
什么是最好的和正确的方式获得良好的速度上市?
table
YAER 2018
ID NAME JAN FEV MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
00001 PAUL OK OK OK OK - OK - - - - - -
00002 MARK OK OK OK - - - OK - - - - - -
00003 JACK OK - - - - - OK - - - - - -
more 50K lines
我的数据库很简单
USERS
user_id
user_name
DOCUMENTS
document_id
document_user_id
document_date
document_file
首先,我得到一个a用户,通过这种方式
$query_users = " SELECT user_id, user_name FROM users ";
$res_users = mysqli_query($mysqli,$query_users) or die(mysqli_error($mysqli));
创建一个表
<table style="width:100%">
<tr>
<th>ID</th>
<th>NAME</th>
<th>JAN</th>
<th>FEB</th>
<th>MAR</th>
<th>APR</th>
<th>MAY</th>
<th>JUN</th>
<th>JUL</th>
<th>AUO</th>
<th>SEP</th>
<th>OCT</th>
<th>NOV</th>
<th>DEC</th>
</tr>
<?php
while($row = mysqli_fetch_assoc($res_users)) {
$user_id = $row['user_id'];
$user_name = $row['user_name'];
?>
<tr>
<td><?php echo $user_name; ?></td>
// For each month I run this query to check if user have document on year
<?
// --------------------------------------------------------------------------------------------
// GET JAN DOCS
// --------------------------------------------------------------------------------------------
$query_doc_month_01 = "
SELECT document_id, document_date,
SUM(documento_date) AS total_documents
FROM documents
WHERE document_user_id = '$user_id'
AND document_date = '$year-01-00'
LIMIT 1
";
$res_doc_month_01 = mysqli_query($mysqli,$query_doc_month_01) or die(mysqli_error($mysqli));
while($row_month_01 = mysqli_fetch_assoc($res_doc_month_01)) {
$document_month_01_id = $row_month_01['document_id'];
?>
<td <? if ($document_month_01 == '') { echo 'bgcolor="#f1f1c1"'; } ?>>
<? if ($document_month_id == '') { echo '- - -'; } else { echo $document_month_01_id; } ?>
</td>
<?php
}
?>
<?
// --------------------------------------------------------------------------------------------
// SAME ABOVE TO GET FEB DOCS
// SAME ABOVE TO GET MAR DOCS
// ETC ETC
// --------------------------------------------------------------------------------------------
?>
</tr>
<?php
}
mysqli_close($mysqli);
?>
</table>
3条答案
按热度按时间r9f1avp51#
看起来您可以在第一个查询中使用联接,一次获取所有数据。这样就不会在循环中执行另一个查询。
如果仍然要显示没有文档的用户,请使用左连接而不是内部连接。
如果只使用一个查询,速度应该会快得多。您可以为我想要的用户设置一个var,并在它更改时创建一个新行。
我也建议您不要在列前面加上表名。我认为这是多余的。只要document.file就足够知道document.document\u文件以外的其他文件。
在电话上打字,如果有打字错误,我很抱歉。
7uhlpewt2#
当前您正在执行这样的操作:对于您正在执行另一个查询的每n个结果,使用n个结果进行查询,乘以12。
这意味着大量的查询请求充斥着数据库。使用内部连接。这不是完整的查询,但可以帮助您开始:
可以使用一个查询,如果必须的话,最多可以使用12个查询。
避免提出大量疯狂的请求。
ztigrdn83#
试试这个:
这应该为每个用户返回一行,每个用户拥有一年中特定月份的文档,如果没有找到任何文档,则不会返回任何内容,您可以检查并显示未返回行的空数据