在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> <?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> <a href=# class=small> <?php echo $row['tag1']; ?></a> <a href=# class=small> <?php echo $row['tag2']; ?></a> <a href=# class=small> <?php echo $row['tag3']; ?></a> <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
相关产品推荐
相关产品推荐

