什么更有效:字符串搜索,或通过SQL加入?

时间:2012-07-27 17:37:49

标签: sql string function search optimization

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

3 个答案:

答案 0 :(得分:1)

如果没有关于这个问题的更多信息,几乎不可能说出来。以下是一些需要考虑的事项:

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

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

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

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

此时,您可能会认为“天哪,字符串似乎是一个更好的主意”。这是错的。其中一个最大的区别在于平均尺寸。如果您的项目平均长于4个字符,则可以使用参考表来节省空间。这个节省的空间立即转化为改进的性能,因为I / O较少。对于索引,无论如何,附加表将在内存中,因此匹配将非常快。

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

答案 1 :(得分:0)

在大多数情况下,存储在表中的速度比SQL字符串操作函数快得多,特别是如果你可以索引单词。

答案 2 :(得分: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),这将非常慢,你应该在哈希上匹配。