2013-02-07 123 views
1

我正在使用mysql数据库。 我的网站被分成不同的元素(PRJ_12为12,12为TSK_14,18为DOC_18,等等)。我们当前将这些元素的引用作为VARCHAR存储在我们的数据库中。关系列是索引的,因此选择速度更快。SQL查询LIKE%在索引

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

所以,我有两个问题:

  1. 是在索引列LIKE ...%要求真的不是一个简单的更慢,其中查询(不喜欢)。我知道如果该列没有编入索引,建议不要求where ... LIKE %请求,但我并不真正了解索引如何工作)。
  2. 我们将参考列分成两部分的事实将使索引表的数量加倍。那是问题吗?

感谢,

+1

索引是有组织的数据结构。当你做一个查询,如'WHERE field_name LIKE'term%''(注意通配符在搜索词的末尾),那么MySQL可以使用索引,因为field_name被索引。它会很快,取决于您有多少记录以及计算机可以提供哪些资源。如果MySQL使用索引,由于索引的组织结构,它通常比检查实际数据快得多。 –

回答

1

1)像总是比一个全面的比较(与=),然而这一切都归结到字段的数据类型和记录(数量更昂贵,除非我们谈论一张巨大的桌子你应该没有问题)

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

所以要为它

+0

因此,考虑到我的专栏是索引的,在索引中做一个LIKE请求要慢得多而不是简单吗?我想知道是否值得改变我的所有要求以适应新的数据库结构,或者如果性能不会增加那么多。 – Olivier

+0

直接索引访问总是更快。如果你喜欢只使用一个%和表达式的结尾,dmbs可以做一些非常快速的搜索来获取值。关键是,在索引列中,只有一个标准,你只能得到一条记录,而你可能会得到更多。这是查询功能上的变化。那是你要的吗? –

0

有许多涉及的因素,但在一般情况下,在仅有一个指标已经不太可能是一个很大的问题表增加一个索引。有些事情要考虑。

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

因此,基于给定的信息,我会建议将它分成两个字段并索引两个字段。