拥有多个指数有哪些缺点?

And*_*att 17 sql database sqlite indexing rdbms-agnostic

我最近通过给SQLite一个很好的索引来加速一个复杂的查询.这样的结果让我想知道是否应该索引常用于JOIN或ORDER BY子句的许多其他字段.但是我不想过度热心并让它适得其反:我认为必须有一些理由创建索引,或者默认情况下每个字段都会被编入索引.

我在这种情况下使用SQLite,但当然也欢迎DBMS不可知的建议.

cha*_*aos 40

索引会减慢插入和更新(这可能会成为锁定的严重问题)并降低成本磁盘空间.这就是它.

  • 刀片不从指数...更新和删除需要找到相关的行(或多个)中受益,使他们受益于该步骤的指标,但随后如果你有很多指标,即使是效益可以抵消.正如你所说,这是一个平衡:) (5认同)
  • 这涵盖了它.不要忘记你**需要适当的索引以获得良好的插入/更新/删除性能.像所有事情一样,这是一种平衡. (2认同)

Mar*_*rkR 6

索引使用磁盘空间来存储,并且需要时间来创建和维护.未使用的没有任何好处.如果查询有许多候选索引,则可以通过让服务器为查询选择"错误"索引来减慢查询速度.

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

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

您需要解释自己的应用程序的查询,以确保频繁执行的查询在可能的情况下使用合理的索引,并且不创建比执行该操作所需的索引更多的索引.


Jar*_*ler 6

为了测试您的特定应用程序,您可以在运行的任何查询前放置"EXPLAIN QUERY PLAN"并检查结果.它将显示它在哪里或不使用索引.

通过这种方式,您可以确定可以使用更多索引的位置以及它们不会产生影响的位置.

Sqlite解释

我使用SqliteSpy手动测试似乎导致问题的查询.


Wal*_*tty 5

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

它取决于表上的读取与写入比率,以及索引实际用于加速查询的频率.