我正在使用mysql数据库。 我的网站有不同的元素(PRJ_12用于projet 12,TSK_14用于任务14,DOC_18用于文档18等)。我们目前将对这些元素的引用作为VARCHAR存储在我们的数据库中。关系列是索引的,因此选择速度更快。
我们正在考虑将这些列分为2列(使用PRJ的列“element_type”和使用12的“element_id”列)。我们正在考虑这个解决方案,因为我们做了很多包含LIKE ...%的请求(例如检索一个用户的所有任务,无论任务的id)。 但是,将这些列拆分为2将增加索引列的数量。
所以,我有两个问题:
LIKE ...%
请求真的比简单查询(不喜欢)更慢。我知道如果列未编入索引,则不建议执行where ... LIKE %
个请求,但我不知道索引是如何工作的。)谢谢,
答案 0 :(得分:1)
1)喜欢总是比完全比较(使用=)更昂贵,但是这一切都归结为字段数据类型和记录数量(除非我们谈论的是一个巨大的表,你不应该有问题)
2)多列索引不是问题,是的,它使索引更大,但是那又是什么?数据类型和总行数很重要,但这就是索引的用途。
所以去吧
答案 1 :(得分:0)
涉及到许多因素,但一般来说,在只有一个索引的表上再添加一个索引不太可能是一个大问题。有些事情需要考虑。
WHERE combinedfield LIKE 'PRJ%'
应该与WHERE element_type = 'PRJ'
基本相同。更昂贵的情况是,如果您在开头使用外卡(例如,LIKE '%abc%'
)。您可以将LIKE搜索视为等同于在字典中查找单词。搜索'overf%'与搜索'溢出'基本相同。您可以在字典中进行“手动”二进制搜索,并快速找到以“overf”开头的第一个单词。搜索'%low'虽然要贵得多。您必须扫描整个字典才能找到以“low”结尾的所有单词。因此,基于给定的信息,我建议将其拆分为两个字段并索引两个字段。