3

假设我将 dataID 存储在包含 1,000,000 条记录的 json 文件中。

我的 zresults.json = {"dataID":["1","2","3", ... "1000000"]}z

我想在数组中找到 ID“100000”。

$file = file_get_contents('results.json');
$data = json_decode($file,true);
if(in_array('100000', $data['dataID']))
{
  echo "found";
} else {
  echo "not found"; 
}

大约花费了 0.6 秒。为结果。

有没有像这样在 json 数组中搜索的更快方法?

请给我一个例子!

先感谢您。

更新:

虽然 sql 会快得多,但考虑到一张表中有 1,000,000 条记录,记录越多空间越大!至少,静态文件减少了服务器负载和更少的空间。

这取决于您的系统是如何设计的。在正确的地点和正确的时间使用它!

4

5 回答 5

2

当然!

$stm = $pdo->prepare("SELECT 1 FROM data WHERE id = ?");
$stm->execute(array(100000));
if ($stm->fetchColumn())
{ echo "found"; } else { echo "not found"; }

您需要先将阵列导入数据库。

于 2013-08-09T11:21:31.607 回答
1

根据results.json文件中数据的结构,您可以进行简单的字符串搜索,例如

$file = file_get_contents('results.json');

if(strpos($file, '"100000"') !== false)
{
    echo 'found';
}
else
{
    echo 'not found';
}

在对您的方法进行基准测试后,我得到了大约 0.78 秒(在我的慢速本地系统上)但是使用这种方法我达到了大约 0.03 秒。

就像我说的,这取决于您的数据结构,但如果它允许您使用这种方法,您将看到显着的速度优势。

于 2013-08-09T11:36:23.450 回答
0

为什么不将 id 存储为键,然后执行以下操作:

if(isset($data['dataID']['100000'])){
 // do something
}

因为检查一个键是否存在比遍历数组要快得多。您可以查看此链接以获取更多信息:

PHP 函数的 Big-O 列表

于 2013-08-09T11:20:53.790 回答
0

如果您绑定到 json 格式,您应该尝试使用像mongo DB这样的基于文档的数据库,而不是使用普通的 json 文件。

请注意,mongoDB 可以将 json 对象保存在内存中,普通 PHP 解决方案必须一次又一次地解析文件。

我看到三个性能提升:

  • 更少的磁盘 IO
  • 更少的解析
  • 基于索引的搜索
于 2013-08-09T11:21:20.123 回答
0

也许可以尝试预测结果,然后您可以使用 in_array 在更小的 json 中搜索值。

否则,您可以尝试其他搜索算法,这些算法可能很复杂。

于 2013-08-09T11:22:49.187 回答