0

我有两个单词列表,我需要找到匹配项(两组的交集。)我应该将每个列表存储为字符串并通过字符串函数(如正则表达式)查找匹配项还是将单词存储在表中,并拥有SQL 通过加入来查找匹配项?

4

3 回答 3

1

如果没有有关该问题的更多信息,几乎不可能说。这里有一些要考虑的事情:

  • 你有多少不同的物品?
  • 典型的行上有多少种不同的组合?
  • 您的搜索是否需要查找通配符?
  • 单个项目多长时间?
  • 您正在运行的数据库引擎和硬件的详细信息。

我想强调的是,在几乎所有情况下,您都希望将值存储在另一个表中。性能不一定是主要原因。更重要的是易于更新和删除单个值,以及支持更多类型的查询(例如所有可用值的列表)的能力。

但是,我们仍然可以考虑性能问题。将值存储在单个字符串中只需要获取带有记录的页面,然后应用一个遍历字符串的函数。对于简单的模式(例如识别固定子字符串的存在),这应该很快。计算机做的事情很少比遍历字符串和比较值更快(假设一个合理的实现)。

在可能的最快连接中,需要读入两个表,并且需要匹配键。这需要额外的努力。情况更糟,因为您确实需要两个额外的表,一个用于单个字符串项,另一个用于原始记录与项之间的关系。

此时,您可能会认为“天哪,字符串似乎是一个更好的主意”。这是错误的。最大的区别之一是平均尺寸。如果您的项目平均长于 4 个字符,那么您可以通过使用参考表来节省空间。节省的空间会立即转化为性能的提高,因为 I/O 更少。有了索引,额外的表无论如何都会在内存中,所以匹配会很快。

而且,还有查询的问题。您可以将标准 SQL 函数用于查询,例如具有 A 和 B 的记录(许多字符串函数是特定于数据库的)。您可以轻松地准确找出数据库中有哪些项目,并且相对容易地找到记录中存在哪些对。您可以跟踪项目何时添加到记录,以及它第一次出现在数据库中的时间。通常,这种灵活的功能——它只是基本的 SQL 功能——是您在管理此类数据时所需要的。

于 2012-07-27T18:04:17.293 回答
0

在大多数情况下,存储在表中会比 SQL 字符串操作函数快得多,尤其是在您可以索引单词的情况下。

于 2012-07-27T17:50:09.183 回答
0

你是在问这个:

SELECT word FROM table_one WHERE word in (SELECT word FROM table_two)

比这更快:

SELECT table_one.word FROM table_one 
INNER JOIN table_two ON table_one.word = table_two.word

第一个答案应该更快,因为第二个会创建一个(可能很大)临时对象(连接表)。

请注意,我假设您在word. 另外:如果字符串很长(例如 URL),这将非常慢,您应该改为匹配哈希。

于 2012-07-27T18:05:27.920 回答