You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在HTML页面中使用多PHP数据库查询是否为合理方案?

问题分析与优化方案

你的场景与问题

我正在开发codeavenues.com网站,首页通过PHP从数据库获取大部分内容。目前在单个HTML页面里用了多个查询,现在出现页面加载时长问题,不确定这种PHP使用方式是否合理,而且没法在Google AdSense平台测试,所以来提问。

你当前的PHP查询代码

<?php
require_once('dbcon.php');
$query = "select * from indexpage";
$query2= "SELECT * FROM `blogintro`   ORDER BY `id` DESC;";
$query3= "SELECT * FROM `indexjob`   ORDER BY `id` DESC;";
$query4= "SELECT * FROM `dsintro`   ORDER BY `id` DESC;";
$result = mysqli_query($con,$query);
$result2 = mysqli_query($con,$query2);
$result3 = mysqli_query($con,$query3);
$result4 = mysqli_query($con,$query4);
?>

页面渲染代码

<div class=row>
<?php
while($row = mysqli_fetch_assoc($result2))
{
    ?>
<div class="alert alert-primary alert-box ant-card" role=alert>
<a href="<?php echo ($row['link']); ?>">
<h6><span class="spinner-grow text-success" role=status style=width:1rem;height:1rem></span>&nbsp;&nbsp;
<?php echo $row['heading']; ?></h6>
<p> <?php echo $row['text']; ?><a href="<?php echo ($row['link']); ?>">Read More</a></p>
</a>
<br><br>
<p><i class="fa fa-rss" aria-hidden=true></i>&nbsp;&nbsp;<a href=# class=small> <?php echo $row['tag1']; ?></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href=# class=small> <?php echo $row['tag2']; ?></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href=# class=small> <?php echo $row['tag3']; ?></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href=# class=small> <?php echo $row['tag4']; ?></a></p>
</div>
<?php
}?>
</div>

核心问题与优化方向

1. 别用SELECT *,只查需要的字段

SELECT *会返回表中所有字段,哪怕你页面只用到部分内容,这会额外增加数据库数据传输量和内存占用,直接拖慢查询速度。

优化示例:针对blogintro表,你只用到了link、heading、text、tag1-tag4,就把查询改成:

$query2= "SELECT link, heading, text, tag1, tag2, tag3, tag4 FROM `blogintro` ORDER BY `id` DESC;";

其他三个查询同理,只保留页面渲染需要的字段。

2. 给排序字段加索引

你所有查询都用了ORDER BY id DESC,如果id不是主键(主键默认带索引),一定要给这几个表的id字段加索引,否则大数据量下排序操作会非常耗时。

添加索引的SQL语句:

ALTER TABLE blogintro ADD INDEX idx_id (id);
ALTER TABLE indexjob ADD INDEX idx_id (id);
ALTER TABLE dsintro ADD INDEX idx_id (id);

3. 给查询结果加缓存

如果首页数据不是实时更新的,把查询结果缓存起来(比如文件缓存、Redis),不用每次请求都查数据库,能大幅降低加载时间。

简易文件缓存示例:

$cacheFile = 'homepage_cache.dat';
$cacheExpire = 3600; // 缓存1小时

// 检查缓存是否有效
if (file_exists($cacheFile) && time() - filemtime($cacheFile) < $cacheExpire) {
    $data = unserialize(file_get_contents($cacheFile));
    $result = $data['indexpage'];
    $result2 = $data['blogintro'];
    $result3 = $data['indexjob'];
    $result4 = $data['dsintro'];
} else {
    // 执行数据库查询(已优化字段版本)
    require_once('dbcon.php');
    $query = "SELECT 你需要的字段 FROM indexpage";
    $query2= "SELECT link, heading, text, tag1, tag2, tag3, tag4 FROM `blogintro` ORDER BY `id` DESC;";
    $query3= "SELECT 需要的字段 FROM `indexjob` ORDER BY `id` DESC;";
    $query4= "SELECT 需要的字段 FROM `dsintro` ORDER BY `id` DESC;";
    
    $result = mysqli_query($con,$query);
    $result2 = mysqli_query($con,$query2);
    $result3 = mysqli_query($con,$query3);
    $result4 = mysqli_query($con,$query4);
    
    // 写入缓存
    $data = [
        'indexpage' => $result,
        'blogintro' => $result2,
        'indexjob' => $result3,
        'dsintro' => $result4
    ];
    file_put_contents($cacheFile, serialize($data));
}

4. 加查询错误排查

有时候加载慢是因为查询出错导致的隐性等待,给每个查询加错误处理,排查问题:

$result2 = mysqli_query($con,$query2);
if (!$result2) {
    die('blogintro查询错误: ' . mysqli_error($con));
}

5. 页面渲染优化

可以开启输出缓冲减少IO损耗,在页面最开头加:

ob_start();

页面结尾加:

ob_end_flush();

关于AdSense测试

页面加载慢会直接影响AdSense广告的加载和展示优先级,建议先按上面的方案优化后,用浏览器开发者工具的Network面板查看各阶段耗时,确认数据库查询或渲染环节的瓶颈解决后再测试。

内容的提问来源于stack exchange,提问作者vikram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:07:46