SQL查询LIKE%索引

时间:2013-02-07 16:25:20

标签: mysql sql

我正在使用mysql数据库。 我的网站有不同的元素(PRJ_12用于projet 12,TSK_14用于任务14,DOC_18用于文档18等)。我们目前将对这些元素的引用作为VARCHAR存储在我们的数据库中。关系列是索引的,因此选择速度更快。

我们正在考虑将这些列分为2列(使用PRJ的列“element_type”和使用12的“element_id”列)。我们正在考虑这个解决方案,因为我们做了很多包含LIKE ...%的请求(例如检索一个用户的所有任务,无论任务的id)。 但是,将这些列拆分为2将增加索引列的数量。

所以,我有两个问题:

  1. 索引列中的LIKE ...%请求真的比简单查询(不喜欢)更慢。我知道如果列未编入索引,则不建议执行where ... LIKE %个请求,但我不知道索引是如何工作的。)
  2. 我们将参考列拆分为两个的事实将使索引表的数量加倍。这是一个问题吗?
  3. 谢谢,

2 个答案:

答案 0 :(得分:1)

1)喜欢总是比完全比较(使用=)更昂贵,但是这一切都归结为字段数据类型和记录数量(除非我们谈论的是一个巨大的表,你不应该有问题)

2)多列索引不是问题,是的,它使索引更大,但是那又是什么?数据类型和总行数很重要,但这就是索引的用途。

所以去吧

答案 1 :(得分:0)

涉及到许多因素,但一般来说,在只有一个索引的表上再添加一个索引不太可能是一个大问题。有些事情需要考虑。

  • 如果表最主要是只读,那么几乎肯定不是问题。如果更新很少,则不需要经常修改索引,这意味着除了额外的磁盘空间外,将会有很少的额外成本。
  • 如果对现有记录的更新不会更改这些键值中的任何一个,则不需要修改索引,因此不会有额外的运行时成本。
  • DELETES和INSERTS需要更新两个索引。因此,如果这是大多数操作(并且远远超过读取),那么额外的索引可能会导致可测量的性能下降(但从人的角度来看可能不是很多而且不明显)。
  • 应该完全优化描述用法的类似运算符。换句话说,如果在两种情况下都存在索引,则子句WHERE combinedfield LIKE 'PRJ%'应该与WHERE element_type = 'PRJ'基本相同。更昂贵的情况是,如果您在开头使用外卡(例如,LIKE '%abc%')。您可以将LIKE搜索视为等同于在字典中查找单词。搜索'overf%'与搜索'溢出'基本相同。您可以在字典中进行“手动”二进制搜索,并快速找到以“overf”开头的第一个单词。搜索'%low'虽然要贵得多。您必须扫描整个字典才能找到以“low”结尾的所有单词。
  • 从长远来看,有两个单独的字段来表示两个单独的值几乎总是更好,因为您可以构建更有效的查询,轻松执行连接等。

因此,基于给定的信息,我建议将其拆分为两个字段并索引两个字段。

相关问题