我希望尽快查询字符串,其中搜索的字符串在数据库中可能有数千个匹配项。还有其他条件需要满足,返回的结果集可能永远不会超过100行。
我提出的选项是有两个表:
表项目
id | name_id
和
表名称
id | string
两个表上的ID都是自动增量。而names.string
是独一无二的。 name_id
当然不是唯一的,并且会有一个索引。
我会从表格items
中选择:
SELECT names.string FROM items
JOIN names
ON items.name_id = names.id
WHERE names.string = 'abcdefg'
AND items.someColumn = items.someValue /*to further filter my results.*/
我的目的是节省空间并提高速度。
这会比使用简单的SELECT * from items WHERE name='abcdefg'
更快吗?
根据我提供的信息,我应该解决任何问题吗?
另外,我不是在寻找子串。只是完整的匹配,即names.string = 'abcefg'
随意忽略这个问题,因为它相当广泛,但是其他方法是否会明显更快(最好不会增加复杂性)?
答案 0 :(得分:0)
使用字符串值创建引用表有很多充分的理由。这种规范化通常是一个好主意。
但是,在您的情况下,出于性能原因,不需要它。如果您的查询类似于:
SELECT items.*
FROM items
WHERE items.string = 'abcdefg' AND items.someColumn = <somevalue>;
然后,以下两个索引中的任何一个最适合此查询:
items(string, somecolumn)
items(somecolumn, string)
在MySQL和SQL Server中都是如此。
您可以索引字符串列,并且使用索引对大多数查询都是有效的。 (如果你开始混合排序,就会出现问题,但是让我们把这样的问题放到这个答案中。)