【问题标题】:Multiple MYSQL queries vs. Multiple php foreach loops多个 MYSQL 查询与多个 php foreach 循环
【发布时间】:2011-01-05 15:10:52
【问题描述】:

数据库结构:

id  galleryId                 type     file_name       description
1   `artists_2010-01-15_7c1ec`  `image`  `band602.jpg`   `Red Umbrella Promo`
2   `artists_2010-01-15_7c1ec`  `image`  `nov7.jpg`      `CD Release Party`
3   `artists_2010-01-15_7c1ec`  `video`  `band.flv`      `Presskit`

我将为应用程序的一个部分提取图像,在另一个部分提取视频等。像这样为每个部分进行多个 mysql 查询是否更好:

$query = mysql_query("SELECT * FROM galleries WHERE galleryId='$galleryId' && type='image');

...或者我应该构建一个关联数组,并在需要使用结果集时一遍又一遍地遍历数组?

感谢您的想法。

【问题讨论】:

    标签: php mysql foreach associative-array


    【解决方案1】:

    这真的取决于,

    IN 运算符

    ini_set('memory_limit', '-1');
    $startMemory = memory_get_usage();
    $conn = mysqli_connect("localhost", "", "", "");
    $ar = array();
    $sql = "SELECT * FROM table WHERE e IN (.....)";
    $result = mysqli_query($conn, $sql);
    while ($row = mysqli_fetch_assoc($result)) {
        $ar[$row['c']] = $row;
    }
    
    echo (memory_get_usage() - $startMemory) / 1024 / 1024, ' MB'; //1409.7124481201
    $end_time = microtime(true);
    echo ($end_time - $start_time) . ' Seconds'; //5.2406549453735 Seconds
    

    Foreach

    ini_set('memory_limit', '-1');
    $startMemory = memory_get_usage();
    $conn = mysqli_connect("localhost", "", "", "");
    $ar = array();
    $array_loop = array(....)
    foreach($array_loop as $key => $value){
       $sql = "SELECT * FROM table WHERE e = '$value'";
       $result = mysqli_query($conn, $sql);
       while ($row = mysqli_fetch_assoc($result)) {
          $ar[$row['c']] = $row;
       }
    }
    
    echo (memory_get_usage() - $startMemory) / 1024 / 1024, ' MB'; //42.773330688477 MB 
    $end_time = microtime(true);
    echo ($end_time - $start_time) . ' Seconds'; //12.469061136246 Seconds
    

    我注意到 foreach 消耗时间但不消耗内存,IN 运算符消耗内存但不消耗时间。所有的测试都是基于 sql procudre 生成的大约 100 万个测试数据完成的

    【讨论】:

      【解决方案2】:

      如果你的数据都来自一个表,我只会做一个查询。

      我假设您正在构建一个页面,其中包含图片部分、视频部分、音乐部分等。编写按媒体类型排序的查询返回结果 - 遍历所有图片,然后遍历所有视频,然后是所有的音乐。

      【讨论】:

        【解决方案3】:

        这取决于哪个更重要:可读性或性能。我希望单个查询和预填充 PHP 数组的执行速度会更快,因为数据库连接很昂贵,但是每个部分的简单查询更具可读性。

        除非您知道(而不仅仅是希望)您将获得大量流量,否则我会进行单独的查询,然后担心优化是否会出现问题。到那时,您无论如何都会想做其他事情,例如构建数据访问层和添加一些缓存。

        【讨论】:

        • 谢谢大家 - 这个(如果属实)对我来说最有意义,因为每个类别中只有少数文件。它是一个查询。
        【解决方案4】:

        如果“部分”是指用户可以查看的单独的单个页面(单独的 HTTP 请求),我建议根据需要按类型查询。如果在只有图像数据集的页面上,您实际上不需要获取例如视频数据集。您不会真正节省太多时间来获取所有内容,因为无论如何您都会为每个页面点击连接到数据库(我假设。)

        如果您所说的“部分”是指一页的不同部分,则一次获取所有内容。这将节省您查询的时间(只有一个查询。)

        但是,根据数据集的大小,您可能会遇到 PHP 的内存限制查询所有内容的问题。然后,您可以尝试提高内存限制,但如果失败,您可能不得不退回到按类型查询。

        使用按类型查询的方法将一些计算负载转移到数据库服务器,因为您只会请求和获取您真正需要的内容。而且您不必编写代码来过滤和排序您的结果。过滤和排序是数据库通常比 PHP 代码更擅长的事情。如果可能的话,启用 MySQL 的查询缓存,这将比你用 PHP 编写的任何东西更快地加速这些查询。

        【讨论】:

          【解决方案5】:

          最好有多个查询。每次运行查询时,所有数据都会被拉出并加载到内存中。如果您有 5 种不同的类型,则意味着该类型的每个页面加载的数据量是其需要加载的 5 倍。

          即使一次只有一个,如果您有超过 100 个或者您可以合理地一次在一个页面上显示的数量,您可能希望相当快地开始使用 LIMIT/OFFSET 查询进行分页。

          【讨论】:

            猜你喜欢
            • 2014-11-29
            • 1970-01-01
            • 1970-01-01
            • 2015-05-18
            • 2012-02-27
            • 1970-01-01
            • 2014-05-14
            • 2021-11-18
            • 1970-01-01
            相关资源
            最近更新 更多