代码之家  ›  专栏  ›  技术社区  ›  Tom

有效地从数据库中读取多个给定记录id数组的记录

  •  1
  • Tom  · 技术社区  · 17 年前

    如果应用程序代码中有一个记录ID数组,那么从数据库中读取记录的最佳方法是什么?

    $idNumsIWant = {2,4,5,7,9,23,56};
    

    显然循环每个ID是不好的,因为 n个 查询:

    foreach ($idNumsIWant as $memID) {
        $DBinfo = mysql_fetch_assoc(mysql_query("SELECT * FROM members WHERE mem_id = '$memID'"));
        echo "{$DBinfo['fname']}\n";
    }
    

    所以,也许使用单个查询更好?

    $sqlResult = mysql_query("SELECT * FROM members WHERE mem_id IN (".join(",",$idNumsIWant).")");
    while ($DBinfo = mysql_fetch_assoc($sqlResult))
      echo "{$DBinfo['fname']}\n";
    

    但是当数组有30000个元素时,这个方法是否可以伸缩?

    5 回复  |  直到 17 年前
        1
  •  2
  •   Nicolas    17 年前

    最好的方法最终取决于数组中的id数量(很明显,您不想向服务器发送50MB的SQL查询,尽管从技术上讲,它可能能够轻松地处理它),但主要取决于您将如何处理结果行。

    • 如果id的数量真的很大,我建议您将IDs数组分成几个组,并运行多个查询,每个查询都有一组id。对于DB服务器来说,可能会更重一些,但是在应用程序端,可以生成多个线程,并在多个记录集到达时以并行方式处理它们。

    Cliffnotes:在这种情况下,只要数据提取不是太大的瓶颈,就要关注数据的使用。并分析你的应用程序!

        2
  •  1
  •   slipbull    17 年前

    我的想法:

    第一种方法在处理和磁盘读取方面成本太高。

    第二种方法效率更高,你不必太担心 query size limit (不过还是要检查一下)。

        3
  •  1
  •   Pascal MARTIN    17 年前

    当我不得不面对这种情况时,我至少看到了三到四种可能的解决方案:

    • 使用您建议的解决方案:一次请求多个id
      • 但是对于一个很长的id列表,您不能这样做:一些数据库引擎对您可以传入的数据数量有限制 IN()
      • 一张很大的单子 可能不是很好的表现
      • (这只是一个例子:对于您的特定情况,对您的数据库/表进行基准测试可能很有趣,因为它可能取决于几个因素)
    • 在某些情况下,您还可以重新考虑您的请求:也许您可以通过使用某种连接来避免传递这样一个id列表? (这实际上取决于您需要什么,您的表的模式,…)

    另外,为了方便修改获取逻辑,我将编写一个函数来获取id列表,并返回与这些id对应的数据列表。

    这样,您只需以相同的方式调用此函数,就可以始终获得相同的数据,而不必担心如何获取数据;这将允许您在需要时更改获取方法(如果有一天您找到了另一种更好的方法),而不会中断任何操作:函数的工作方式将更改,但由于它的接口(输入/输出)将保持不变,因此它不会改变代码的其余部分:-)

        4
  •  1
  •   HLGEM    17 年前

        5
  •  0
  •   Bin Bin    17 年前

    使用StringTokenizer,通过将字符串分隔成标记,可以更容易地处理这个问题,检索多个值的数据