INDEXED BY短语会强制SQLite查询计划程序在DELETE,SELECT或UPDATE语句上使用特定的命名索引。INDEXED BY短语是SQLite扩展,不能移植到其他SQL数据库引擎中。
“ INDEXED BY index-name ”短语指定必须使用命名索引才能在前面的表中查找值。如果index-name不存在或不能用于查询,则SQL语句的准备失败。“ NOT INDEXED”子句指定访问上表时不使用索引,包括由UNIQUE和PRIMARY KEY约束创建的隐式索引。但是, 即使指定了“ NOT INDEXED” ,rowid仍可用于查找条目。
一些SQL数据库引擎提供了非标准的“提示”机制,该机制可用于为查询优化器提供有关特定语句应使用哪些索引的线索。SQLite的INDEXED BY子句 不是提示机制,因此不应这样使用。INDEXED BY子句不会为优化器提供有关使用哪个索引的提示。它为优化器提供了使用哪个索引的要求。如果查询优化器无法使用INDEXED BY子句指定的索引,则查询将失败并显示错误。
INDEXED BY子句不适用于调整查询的性能。如果架构更改(例如删除或创建索引)导致时间敏感查询的查询计划发生更改,则INDEXED BY子句的目的是引发运行时错误。INDEXED BY子句旨在帮助在回归测试期间检测到不良的查询计划更改。建议应用程序开发人员在应用程序设计,实现,测试和调优期间忽略对INDEXED BY的所有使用。如果要使用INDEXED BY,则应在“锁定”设计时在开发过程的最后插入它。
该查询规划的清单描述了应用程序开发人员应该如下,以帮助解决查询规划问题的步骤。请注意,INDINDD BY的使用是最后的手段,仅在所有其他措施均失败时才使用。
一元“ +”运算符 可用于取消WHERE子句中的术语的索引使用范围。谨慎使用一元+有时可以帮助防止查询计划程序选择不良索引,而又不限制它使用一个特定的索引。仔细放置一元+运算符是控制查询使用哪些索引的更好方法。
所述sqlite3_stmt_status() C / C ++接口与一起 SQLITE_STMTSTATUS_FULLSCAN_STEP和SQLITE_STMTSTATUS_SORT动词可用于在运行时,以检测当一个SQL语句未有效地利用索引。许多应用程序可能更喜欢使用sqlite3_stmt_status()接口来检测索引滥用,而不是此处所述的INDEXED BY短语。