我最近通过为SQLite提供了一个很好的索引来加快一个复杂的查询速度。这样的结果让我想知道是否应该索引常用于JOIN或ORDER BY子句的许多其他字段。但是我不想过度热心并且反感我:我认为必须有一些原因不来创建索引,或者默认情况下每个字段都会被索引。
我在这种情况下使用SQLite,但当然也欢迎DBMS不可知的建议。
答案 0 :(得分:40)
索引会降低插入和更新速度(这可能会成为严重的锁定问题)并降低成本磁盘空间。这就是它。
答案 1 :(得分:6)
索引占用磁盘空间来存储,并且需要时间来创建和维护。未使用的没有任何好处。如果查询有许多候选索引,则可以通过让服务器为查询选择“错误”索引来减慢查询速度。
使用这些因素来决定是否需要索引。
通常可以创建永远不会被使用的索引 - 例如,只有两个可能值的(非空)字段上的索引几乎肯定是无用的。
您需要解释自己的应用程序的查询,以确保频繁执行的查询在可能的情况下使用合理的索引,并且不要创建比执行此操作所需的索引更多的索引。
答案 2 :(得分:6)
为了测试您的特定应用程序,您可以在运行的任何查询前放置“EXPLAIN QUERY PLAN”并检查结果。它会告诉你它在哪里或者没有使用索引。
通过这种方式,您可以确定可以使用更多索引的位置以及它们不会产生影响的位置。
我使用SqliteSpy手动测试似乎导致问题的查询。
答案 3 :(得分:5)
磁盘空间中索引的成本通常很小。在表更改时更新索引的额外写入的成本通常是适中的。额外锁定的成本可能很高。
这取决于表上的读取与写入比率,以及索引实际用于加速查询的频率。