【问题标题】:Application for filtering database for the short period of time申请短期过滤数据库
【发布时间】:2020-07-16 20:32:35
【问题描述】:

我需要创建一个应用程序,让我能够尽快获取具有特定条件的用户的电话号码。例如,我们在 sql 表中有 4 列(地区、收入、年龄 [和电话号码本身的第 4 列])。我想从表格中获取特定地区和收入的电话号码。只做一个 sql 查询将无济于事,因为它需要大量时间。数据库每天更新 1 次,我有时间按照自己的意愿准备数据。

问题是:您如何使获取具有特定条件的电话号码的过程尽可能快。 O(1) 在最好的情况下。考虑将 sql 表中的值存储在 RAM 中以获得最快的访问速度。

我想出了以下想法:

  1. 为每个电话号码创建一个比特集。如果特定条件为假,则为 0,如果条件为真,则为 1。但我不确定是否可以为没有布尔值的列实现它。
  2. 用电话号码创建一个向量。
  3. 使用电话号码的位集创建一个向量。
  4. 要获取电话号码 - 迭代第二个向量并将位集与所需的位集进行比较。

这根本不是 O(1)。而且我仍然不知道如何处理非布尔列。我想也许可以用 std::unordered_map 做一些好事(所有电话号码都是唯一的)或者用矢量和掩码改进我的想法。

附: SQL 表占用 4GB 内存,我最多可以在 RAM 中存储 8GB。共有 500 列。

【问题讨论】:

  • 你是说你可以查询这 500 列中的任何一个吗?
  • 该程序应为任何请求提供电话号码,是的

标签: c++ sql algorithm performance data-structures


【解决方案1】:

我想从表格中获取特定地区和收入的电话号码。

您将在(region, income) 上的数据库中创建索引。让数据库完成工作。

【讨论】:

  • 你将如何实现它以及内存呢?有 2^500 个查询组合。像(地区),(地区,收入),(地区,年龄),(地区,收入,年龄),(收入,年龄)等,但有 500 列。
【解决方案2】:

如果您真的希望它更快,我认为您应该考虑使用 ElasticSearch。将数据库中的每部电话都视为具有属性(您的列)的文档。 您需要每天(或实时)重新索引表一次,但是当需要搜索时,您只需使用 ElasticSearch 的过滤器来查找结果。

另一种选择是为每一列建立一个索引。在这种情况下,引擎将执行索引合并以提高性能。我也会考虑使用内存表。如果您写入此表 - 考虑使用只读副本仅用于读取。 要优化您的表格 - 将您的查询保存在某处并为前 X 热门搜索添加索引(用于多列)取决于您的内存限制。 您可以使用 NVME 作为您的数据库磁盘(如果您无法将其加载到内存中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多