2011-07-20 92 views
1

在我写一个软件有搜索一个给定的表信息的能力。搜索表单有5个字段,当然这些字段与表中的不同列相对应,但所有字段都是可选的。MySQL的多个索引VS多列索引搜索

我的问题是关于是否多列索引将工作,并建立一个查询它的正确方法。

如果我有跨越5列的单一指标,我建立一个查询来搜索他们,当谈到在这个指数我不是搜索领域,做我做这样的事情:

field1 = 10和field2> 0 AND ...

或者我应该不包括未使用的列呢?

我周围中搜索有关多列索引的信息,但我似乎无法找到当你需要跳过一列在一个给定的索引,如果你根本不关心这个做什么在那个具体的例子中。

+0

这取决于查询工作负载 –

+0

......尽一切所能来避免表扫描。这是查询无法索引的时候。除非表格行是固定长度,并且很小,否则不要使用表格扫描。像1-20行一样。 – BradLaney

回答

3

你必须在MySQL了解(在InnoDB中的情况下),它只会使用索引的最左前缀。因此,如果索引位于Field1 + Field2中,则只使用中的Field2查询哪个不能使用整个索引。

并且如果Field1 + Field2 + Field3是索引,则只有Field1 & Field3的查询在其中会发生同样的情况。

选项1

你将不得不为每一个搜索场景单独的指数,如果你想对每个搜寻。但是,如果表格很大,那么索引也会变得非常大。 如果这些搜索查询经常进行,这将是值得的。

选项2

您可以通过将低选择性列到最左侧的用一记漂亮的伎俩,如果你的搜索有低选择性(即性别),并使用Gender IN(M, F)把它列入了其中子句与其他列一起使用以利用整个索引。

1

对于标准

field1 = 10 AND field2 > 0 

你需要有综合指数field1 + field2(在这个特定的顺序)查询

+0

如果仅查询field2,则不使用索引。所以如果查询可以是任何事情,那么最好是有单独的索引。 – KaKa

+0

@kaka:不。如果两个字段都参与查询,那么将使用此索引,或者仅使用'field1'。对于不同的查询,有一些技巧,除了N个单个索引 – zerkms

+1

@kaka之外,这是正确的,因为它们被预订为field1,然后是field2。 MySQL中的索引从左到右读取。 – Dex

0

这取决于您的查询。如果你经常用field1和field2做很多查询,那么有一个复合索引是有意义的。否则,您可能会很好地处理多个单列索引。