Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 高效地从数据库中读取给定记录ID数组的多个记录_Php_Mysql_Database_Performance - Fatal编程技术网

Php 高效地从数据库中读取给定记录ID数组的多个记录

Php 高效地从数据库中读取给定记录ID数组的多个记录,php,mysql,database,performance,Php,Mysql,Database,Performance,如果在应用程序代码中有一个记录ID数组,那么从数据库中读取记录的最佳方法是什么 $idNumsIWant = {2,4,5,7,9,23,56}; 显然,在每个ID上循环是不好的,因为您不需要n个查询: 那么,使用单个查询是否更好 $sqlResult = mysql_query("SELECT * FROM members WHERE mem_id IN (".join(",",$idNumsIWant).")"); while ($DBinfo = mysql_fetch_assoc($s

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

$idNumsIWant = {2,4,5,7,9,23,56};
显然,在每个ID上循环是不好的,因为您不需要n个查询:

那么,使用单个查询是否更好

$sqlResult = mysql_query("SELECT * FROM members WHERE mem_id IN (".join(",",$idNumsIWant).")");
while ($DBinfo = mysql_fetch_assoc($sqlResult))
  echo "{$DBinfo['fname']}\n";
但是当数组有30000个元素时,这种方法是否可以扩展

你如何有效地解决这个问题?

我的想法:

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

第二种方法效率更高,你不必太担心,但还是要检查它。

我的想法:

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


第二种方法效率更高,您不必太担心,但还是要检查它。

当我必须处理这种情况时,我看到至少三到四种可能的解决方案:

每个id一个请求;正如你所说,这不是很好:有很多要求;我一般不这么做 使用您提出的解决方案:一个请求多个ID 但是你不能用一个很长的ID列表来实现这一点:一些数据库引擎对你可以传入的数据数量有限制 在性能方面,一个非常大的列表可能不是很好 所以我通常会做一些事情,比如请求X id,然后重复这个。例如,对于对应于1000个ID的fecth数据,我可以执行20个请求,每个请求获取50个ID的数据。这只是一个示例:对于您的特定情况,基准测试您的DB/表可能很有趣,因为它可能取决于多个因素 在某些情况下,您还可以重新考虑您的请求:也许您可以通过使用某种连接来避免传递这样一个ID列表?这实际上取决于您需要什么,表的模式。。。 另外,为了便于修改抓取逻辑,我将编写一个函数来获取ID列表,并返回与这些ID对应的数据列表


通过这种方式,您只需以相同的方式调用此函数,并且始终获得相同的数据,而不必担心如何获取数据;如果有一天你找到了另一种更好的方法,这将允许你在需要的时候改变抓取方法,而不会破坏任何东西:函数的工作方式将改变,但由于它的接口输入/输出将保持不变,因此在代码的其余部分不会改变任何东西:-

当我必须处理这种情况时,我认为至少有三到四种可能的解决方案:

每个id一个请求;正如你所说,这不是很好:有很多要求;我一般不这么做 使用您提出的解决方案:一个请求多个ID 但是你不能用一个很长的ID列表来实现这一点:一些数据库引擎对你可以传入的数据数量有限制 在性能方面,一个非常大的列表可能不是很好 所以我通常会做一些事情,比如请求X id,然后重复这个。例如,对于对应于1000个ID的fecth数据,我可以执行20个请求,每个请求获取50个ID的数据。这只是一个示例:对于您的特定情况,基准测试您的DB/表可能很有趣,因为它可能取决于多个因素 在某些情况下,您还可以重新考虑您的请求:也许您可以通过使用某种连接来避免传递这样一个ID列表?这实际上取决于您需要什么,表的模式。。。 另外,为了便于修改抓取逻辑,我将编写一个函数来获取ID列表,并返回与这些ID对应的数据列表


通过这种方式,您只需以相同的方式调用此函数,并且始终获得相同的数据,而不必担心如何获取数据;如果有一天您找到了另一种更好的方法,这将允许您在需要时更改抓取方法,而不会破坏任何东西:函数的工作方式将发生变化,但由于其接口输入/输出将保持不变,它不会改变代码其余部分的任何内容:-

如果是我,并且我在in子句中有这么大的值列表,我会使用一个存储过程和一个包含我想要的值的变量,并使用其中的函数将它们发送到临时表中,然后加入到临时表中。根据要发送的值的大小,可能需要将其拆分为多个输入变量进行处理。如果这些值经常在数据库中查询,是否有任何方法可以永久存储这些值?用户将如何选择30000个值,当然他或她是n;你不打算把它们都放进去吗?因此,可能有一种更好的方法可以基于join和where子句查询表。

如果是我,并且我在in子句中有这么大的值列表,我会使用一个存储过程和一个包含我想要的值的变量,并使用其中的函数将它们发送到临时表中,然后加入到临时表中。根据要发送的值的大小,可能需要将其拆分为多个输入变量进行处理。有没有wa
y如果这些值经常在数据库中查询,它们是否可以永久存储?用户将如何选择30000个值,当然他或她是n;你不打算把它们都放进去吗?因此,可能有一种更好的方法可以基于join和where子句查询表。

最好的方法最终取决于数组中的ID数量。显然,您不想向服务器发送50MB SQL查询,即使从技术上讲,它可能能够轻松地处理它,但主要是关于如何处理结果行

如果ID的数量非常少,比如说最多几千个,那么使用IN语法的带有WHERE子句的单个查询将是完美的。您的SQL查询将足够短,以便可靠、高效、快速地传输到DB服务器。此方法非常适合在结果记录中进行单线程循环

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

这两种方法都会奏效


Cliffnotes:对于这种情况,只要数据提取不是太大的瓶颈,就要关注数据使用情况。和配置您的应用程序

最好的方法最终取决于数组中的ID数量,您显然不想向服务器发送50MB的SQL查询,尽管从技术上讲,它可能能够轻松处理,但主要取决于如何处理生成的行

如果ID的数量非常少,比如说最多几千个,那么使用IN语法的带有WHERE子句的单个查询将是完美的。您的SQL查询将足够短,以便可靠、高效、快速地传输到DB服务器。此方法非常适合在结果记录中进行单线程循环

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

这两种方法都会奏效


Cliffnotes:对于这种情况,只要数据提取不是太大的瓶颈,就要关注数据使用情况。和配置您的应用程序

使用StringTokenizer通过将字符串拆分为标记,u将更容易处理此问题,为多个值检索数据

使用StringTokenizer通过将字符串拆分为标记,u将更容易处理此问题,为多个值检索数据

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