我有两个单词列表,我需要找到匹配(两个集合的交集。) 我应该将每个列表存储为字符串并通过字符串函数(如正则表达式)查找匹配项,还是将单词存储在表中,让SQL通过加入来查找匹配项?
答案 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),这将非常慢,你应该在哈希上匹配。