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