【问题标题】:Is it efficient to query on a sub-index查询子索引是否有效
【发布时间】:2019-12-06 02:17:39
【问题描述】:

我想查询一个表,该表具有列 a、b、c、d 的索引。 如果在 where 子句中过滤列 a、b 和 c,索引是否足够好?还是应该只为树字段(a、b 和 c)创建一个新索引?

alter table myTable add index (a,b,c,d)

...

SELECT * 
FROM myTable
WHERE a = ? AND b = ? AND c = ?

【问题讨论】:

  • 对 a,b,c 完美,但对 b,c,d 没用
  • @Strawberry,请注意解释一下。
  • @AnkitBajpai 手册详细介绍了这一点
  • 索引使用被保留,这意味着index (a,b,c,d)可以处理WHERE a = ?,WHERE a = ? AND b = ?,WHERE a = ? AND b = ? AND c = ?,WHERE a = ? AND b = ? AND c = ? AND d = ?有效..一个技巧可以使用WHERE a >= 'a' AND b = ?或@987654329 @ 例如,当您不知道要搜索的值时 但它会导致全索引扫描效率较低但很可能比全表扫描更快,因为索引文件通常是(比表格文件更小。
  • (a, b, c, d) 上的索引明显大于(a, b, c) 上的索引。这可以决定有多少索引适合内存,以及在执行期间需要用磁盘中索引的其他部分替换内存中的多少数据。磁盘操作成本高昂,因此使用较小的索引可能会最大程度地减少从磁盘的读取,这会带来好处。

标签: mysql sql database indexing


【解决方案1】:

MySQL 在多列索引上有很好的documentation。你应该阅读它。

要了解此类索引是如何工作的,基本上对标准索引有两个操作:

  • 索引可用于查找特定值。
  • 可以在两个值之间扫描索引(或直到达到第二个值)。

(MySQL 不支持第三种方法,跳过扫描。)

四列上的索引a、b、c、d,对于这四列上的条件是最佳的,其中列具有相等条件 - 按顺序 - 并且最多一个非= 最后的条件。例如:

  • a = ? and b = ? and c = ?
  • a = ? and b < 10
  • a = ? and b = ? and c = ? and d in (?, ?, ?)
  • a between ? and ?

索引可以部分使用,尤其是当a 具有相等条件并提及其他列时:

  • a = ? and d < ?
  • a = ? and c in (?, ?, ?) and d < ?

但是,在这种情况下会扫描索引,丢弃不匹配的行。

我想不出有两个索引有用的任何情况,其中一个是另一个的严格前缀——例如(a, b, c, d) 和(a, b, c)。如果索引不是严格的前缀,例如(b, c, d) 或(a, c, b, d),它会很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多