加快从数据库加载图像

Posted

技术标签:

【中文标题】加快从数据库加载图像【英文标题】:Speeding Up Image Loading from DB 【发布时间】:2012-06-04 19:22:09 【问题描述】:

我正在从数据库中加载 9 张图片,我的语法大致如下:

<img src="image_loader.php?id=4"></img>

我的 image_loader.php 的 PHP 看起来像:

<?php
    /* I set up my connection using mysql_connect and mysql_select_db */

    $query = sprintf("SELECT ... FROM ... WHERE id='".$_GET["id"]."'");
    $result = mysql_query($query, $con);
    mysql_close($con);

    if (!$result) 
        // no result
    
    else 
        $row = mysql_fetch_row($result); 
        header('Content-type: image/png');
        echo $row[0];
        mysql_free_result($result);
        
?>

每张图片大约 10-13k,但是这堆图片的加载速度似乎很慢。我意识到浏览器一次可以执行的请求数量存在一些瓶颈,但等待时间似乎是不必要的。

关于如何快速从数据库加载图像有什么建议吗?

另外,这几乎是一个单独的问题,但是否可以指示浏览器(或服务器)使用现在 .gif/.png/.jpg srcs 缓存图像?似乎 Firefox 有,而 Chrome 没有,但我不确定。

【问题讨论】:

如果您的缓存标头设置正确且 URL 未更改,则应缓存图像。如果您的问题出在带宽上并且您经常发送相同的图像,您应该考虑将它们组合起来,以便只有一个查询到服务器(实际上取决于图像,例如,它会支付一打小图像的费用)。 您的浏览器可能没有缓存图像,因为它们具有查询字符串,可以考虑链接到 image_loader\4.jpg 之类的内容并使用 URL 重写。您还可以按照 dystroy 的建议“平铺”图像,使用类似于轮廓 here 的技术。 我还会考虑将图像存储在数据库中是否最有意义。可能,但应该认真考虑,因为在文件系统中给每个图像一个唯一的文件名并将 that 存储在数据库中通常会更快。如果您可以从客户端直接请求该文件,而不是请求执行fopen() 的通用PHP 脚本,您将获得额外的速度 确实如此,但在这种情况下(对于普通数据库),这甚至是不可测量的。 @vpiTriumph,您的mysql_connect() 函数 localhost 中的主机名是什么? (如果它是别的东西,它到底是什么并不重要)。如果它不是本地主机,我建议使用时间戳检测您的image_loader.php 代码以定位延迟?我的猜测是它会在查询中。 【参考方案1】:

我首先会考虑将图像存储在数据库中是否最有意义。可能,但应该认真考虑,因为在文件系统中为每个图像提供一个唯一的文件名并将 存储在数据库中通常会更快。

如果您可以从客户端直接 请求该文件,而不是请求执行某种fopen() 样式的通用PHP 脚本,您将获得额外的速度抽象。

为了缩小延迟的来源,首先检查您的数据库是否与您的网络服务器托管在同一台服务器上可能会有所帮助。它不是在本地托管而是在远程数据库服务器上托管的一个迹象是检查您在mysql_connect() 调用中提供的主机字符串。 localhost 会暗示它是本地的,其他的会暗示它不是。请注意,许多共享托管服务(例如 GoDaddy)将其数据库服务器与网络服务器分开。

为了更好地了解延迟的来源,我建议使用时间戳检测您的 image_loader.php 代码来定位延迟?我的猜测是它会在查询中。

如果您的查询延迟,您需要限制查询的数量。允许您进行一次查询而不是 9 次查询的策略将限制任何网络服务器到数据库服务器延迟的影响。

【讨论】:

以上是关于加快从数据库加载图像的主要内容,如果未能解决你的问题,请参考以下文章

Android同时使用cardview图像加载非常懒惰

如何使用资产库加快图像加载速度?

从图像 URL 加载图像需要很长时间才能显示

部署 django 应用程序以加快加载速度的最佳方式

如何加快加载数据集

深入学习Google Colab:加载大型图像数据集的时间很长,如何加速这个过程?