【问题标题】:Which is faster for checking, sql/database query or file_get_content?检查,sql/数据库查询或file_get_content哪个更快?
【发布时间】:2022-01-20 13:35:59
【问题描述】:

我有这种类型的数据,我称之为ids

我有 8.6M 这些ids 用于“有效性”检查。

tt9916820
tt9916822
tt9916824
tt9916826

我想知道哪个会更好更快

像这样使用 file_get_contents():

$imdbid = $_GET['id'];
if (strpos(file_get_contents("http://127.0.0.1/ids.txt"),$imdbid) !== false) {
    echo 'valid id';
} else {
    echo 'invalid id';
}

如果我应该将所有 8.6M+ id 导入我的数据库并使用这样的 sql 查询:

$imdbid = $_GET['id'];
$existing = $wpdb->get_var("SELECT COUNT(*) from wp_postmeta where dbids='$imdbid'");
if ($existing) {
    echo 'valid id';
} else {
    echo 'invalid id';
}

哪个会更快?

我是新手,如果有更好的方法,请告诉我,因为我想了解更多信息。谢谢!

【问题讨论】:

  • 你试过什么?进展如何?

标签: mysql performance query-optimization file-get-contents database-performance


【解决方案1】:

使用合适的INDEX,数据库可以发现给定值是否在表中,并在几毫秒内完成。

搜索包含 860 万行的文件(在您的示例中可能为 86MB)将 ,甚至可能 分钟。此外,您建议的代码在获取和搜索之间需要空间来容纳整个 86MB。

并且,对于strpos,如果 id 是可变长度的,您可能会得到虚假匹配。例如,搜索“tt9916822”将获得 3 次命中,但均未成功。数据库解决方案将防止这种情况发生。

tt9916824
tt9916826
tt99168220
tt99168221
tt99168222

【讨论】:

  • if the ids are variable length, you could get a spurious match. For example, searching for "tt9916822" will get 3 hits, none of which are successful. The database solution will prevent this. 现在这解决了我使用数据库的选择。也许您可以将我链接到我可以阅读和了解索引以及如何正确执行的地方?我也将对其进行更改,可能每周进行一次,但仅插入新的 id 行,正确操作应该没有问题吗?
  • 这里没有足够的空间来告诉你如何在数据库中建立你的第一个表,但我会给你一些提示。由于该表非常简单,因此请使用LOAD DATA ... 来填充它。如果您需要在每周更新期间读取表,请将数据加载到新表中,然后使用RENAME TABLE 将其交换到位。
【解决方案2】:

如果文件不经常更改,则应将其导入表并在要搜索的列上创建索引。对索引列的查询应该大大比:

  1. 通过网络获取 8MB(86MB?)文件
  2. 全部加载到内存中(php有内存限制)
  3. 使用strpos 搜索(仅在找到匹配项或到达字符串末尾时停止)
  4. 才发现被搜索的值不存在

【讨论】:

  • 您好,我计划可能每周对文件进行更改,但只在最底部/最后添加新的 id 行。查询起来还是很适合的吧?
  • MySQL 可以从 txt 文件导入数据 - 并且 - 它允许您编写可以插入数据忽略重复的查询,因此您将数据写入文件的顺序无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多