【问题标题】:Can index creation use existing indexes?索引创建可以使用现有索引吗?
【发布时间】:2009-11-25 07:17:52
【问题描述】:

我在 A、B 和 C 列上有单独的索引。我想在 A+B+C 三个列上创建一个复合索引。

我的现有索引会对复合索引创建产生什么影响?数据库会利用它们吗?它们是否无关紧要,或者它们会减慢我的新复合索引的创建速度?

我正在使用 MySql 5.1。

编辑:顺便说一句,该表有几百万行。

编辑 2:感谢 tster 的建议:我在一个小得多的表(诚然只有 20,000 行)上进行了尝试,但即便如此,当个别索引已经存在。

【问题讨论】:

  • iirc,MySQL 只使用一个索引。我会自己创建覆盖/复合索引,并摆脱单个索引
  • @OMGPonies:感谢您的评论。你会先放弃个别的,还是没关系?
  • 为什么不在那里创建带有三个索引的索引并计时,然后在没有索引的情况下执行相同的操作,看看是否更快。我的猜测是没有区别,因为扫描三个索引然后将它们合并在一起可能比扫描整个关系更昂贵。
  • 我发现那里的单个索引花费了更长的时间,这令人惊讶。我非常想知道为什么会这样。
  • “几百万行”听起来并不多,您可能可以在 30 分钟内重建表(取决于您的确切数据)。困难的是创建索引需要几个小时。如果表适合 ram,则创建索引相对较快。您的服务器应该有足够的内存来容纳“几百万行”的表

标签: mysql indexing


【解决方案1】:

当您添加索引时,MySQL 通常会重建整个表,因此所有现有的也会重建。这可能很慢。

唯一的例外是使用 InnoDB 插件添加索引,它不会。

据我所知,它在构建索引时总是进行全表扫描,但是如果您添加的索引与另一个索引具有相同(或子集)的列,它可以进行索引扫描。此类索引通常仅在列的顺序不同时才有用。

使用库存 mysql,您拥有的索引越多,创建新索引的速度就越慢,因为它也会重建现有索引。

有了插件,我觉得没什么区别。

无论哪种方式,如果您打算添加多个索引,您应该一次性完成所有这些,而不是一次一个。

【讨论】:

    【解决方案2】:

    您现有的索引与新索引的创建无关。索引是磁盘上的物理事物,您要求数据库创建一个全新的索引,其结构与现有的三个索引完全不同。

    (警告:我对 MySQL 没有特别的了解。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 2011-10-28
      • 2015-04-04
      • 2020-11-11
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多