【问题标题】:What are the disadvantages of having many indices?有许多索引有什么缺点?
【发布时间】:2010-10-20 08:04:39
【问题描述】:

我最近通过为 SQLite 提供一个很好的索引来将复杂的查询速度提高了一个数量级。像这样的结果让我想知道我是否应该索引很多其他通常用于 JOIN 或 ORDER BY 子句的字段。但我不想过分热心并让它适得其反:我认为创建索引一定有一些原因,否则默认情况下每个字段都会被索引。

在这种情况下,我使用的是 SQLite,但当然也欢迎与 DBMS 无关的建议。

【问题讨论】:

    标签: sql database sqlite indexing rdbms-agnostic


    【解决方案1】:

    索引会减慢插入和更新速度(这可能会成为一个非常严重的锁定问题)并占用磁盘空间。差不多就这些了。

    【讨论】:

    • 这涵盖了它。不要忘记您确实也需要适当的索引来获得良好的插入/更新/删除性能。像所有事物一样,这是一种平衡。
    • 插入不会从索引中受益...更新和删除需要找到相关的行,因此它们会从该步骤的索引中受益,但是如果您有很多索引,即使这样利益可以被否定。正如你所说,这都是一种平衡:)
    【解决方案2】:

    索引会占用磁盘空间来存储,并且需要时间来创建和维护。未使用的没有任何好处。如果查询有很多候选索引,则可能会因为让服务器为查询选择“错误”的索引而减慢查询速度。

    使用这些因素来决定您是否需要索引。

    通常可以创建永远不会使用的索引 - 例如,在只有两个可能值的(非空)字段上的索引几乎肯定是没用的。

    您需要解释您自己的应用程序的查询,以确保经常执行的查询尽可能使用合理的索引,并且创建的索引不会超过所需的索引。

    【讨论】:

    • 当分布极不均匀时,索引一个二值字段(有时)会很有用 - 并且数据库通过统计知道这一点。
    【解决方案3】:

    索引在磁盘空间中的成本通常是微不足道的。表更改时更新索引的额外写入成本通常适中。额外锁定的成本可能很高。

    这取决于表的读写比率,以及索引实际用于加速查询的频率。

    【讨论】:

    • 嗯,根据表和被索引的字段,磁盘空间成本并不总是微不足道的。我遇到过很多情况,索引空间的总和是表空间总和的两倍(或更多)......
    • 同意 Dems;对于窄表,非聚集索引的大小可以与表相当。假设一个索引花费了表本身一半的磁盘空间;具有六个索引的表在磁盘上的大小是未索引表的四倍。聚集索引基本上是免费的。
    • 不,磁盘空间中索引的成本并非“通常微不足道”。索引可能会占用大量空间。
    【解决方案4】:

    为了测试您的特定应用程序,您可以将“EXPLAIN QUERY PLAN”放在您运行的任何查询前面并检查结果。它会告诉你它在哪里使用或不使用索引。

    这样您就可以确定可以在哪些地方使用更多索引以及它们不会产生影响的地方。

    Sqlite Explain

    我使用SqliteSpy 手动测试似乎会造成问题的查询。

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2013-11-30
      • 1970-01-01
      • 2019-09-15
      • 2011-04-26
      • 2011-02-28
      • 1970-01-01
      • 2017-06-01
      • 2015-04-19
      相关资源
      最近更新 更多