【问题标题】:MySQL multiple indexes vs multi-column index for searchingMySQL 多索引与多列索引进行搜索
【发布时间】:2011-07-20 03:04:56
【问题描述】:

在我正在编写的软件中,可以搜索给定表格中的信息。搜索表单有5个字段,当然都对应一个表中的不同列,但是所有字段都是可选的。

我的问题是关于多列索引是否有效以及为它构建查询的正确方法。

如果我有一个跨 5 列的索引,并且我构建了一个查询来搜索它们,那么当涉及到该索引中我不搜索的字段时,我是否会执行以下操作:

field1 = 10 AND field2 > 0 AND ...

或者我根本不应该包含未使用的列?

我搜索了有关多列索引的信息,但是当您需要跳过给定索引中的一列或者您根本不关心该列时,我似乎找不到该怎么做在那个特定的情况下。

【问题讨论】:

  • 这取决于...取决于查询工作量
  • 尽你所能避免表扫描。这是查询没有可索引的时候。除非表行是固定长度并且很小,否则永远不要使用表扫描。比如 1-20 行。

标签: mysql indexing


【解决方案1】:

您必须了解在 MySQL(在 InnoDB 的情况下)它只使用索引的最左边的前缀。所以如果索引在Field1 + Field2中,只用WHERE中的Field2查询是不能利用整个索引的。

如果Field1 + Field2 + Field3 是索引,那么WHERE 中只有Field1 & Field3 的查询也会发生同样的情况。

选项 1

如果您想优化每个搜索,您必须为每个搜索场景创建一个单独的索引。但是,如果表很大,那么索引也会变得非常大。 如果这些搜索查询非常频繁,这将是值得的。

选项 2

如果您的搜索具有低选择性(即性别),您可以使用一个巧妙的技巧,将低选择性列放在最左侧并使用Gender IN(M, F) 将其包含在 WHERE 子句与其他列一起使用整个索引。

【讨论】:

    【解决方案2】:

    用于有条件的查询

    field1 = 10 AND field2 > 0
    

    您需要有复合索引field1 + field2(按此特定顺序)

    【讨论】:

    • 所以如果只查询 field2,则不使用索引。因此,如果查询可以是任何内容,最好有单独的索引。
    • @kaka:不。如果两个字段都参与查询,或仅field1,将使用此索引。对于不同的查询,有一些技巧,除了 N 个单一索引
    • @kaka,这是正确的,因为它们被预先订购为 field1,然后是 field2。 MySQL 中的索引是从左到右读取的。
    【解决方案3】:

    这取决于您的查询。如果您经常使用 field1 和 field2 进行许多查询,那么拥有一个复合索引是有意义的。否则,您可能会在多个单列索引上过得很好。

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2019-03-07
      相关资源
      最近更新 更多