sqlite:;“无查询解决方案”;用于列时的覆盖索引!=&引用;“什么?”;

sqlite:;“无查询解决方案”;用于列时的覆盖索引!=&引用;“什么?”;,sqlite,Sqlite,下面的查询抛出“无查询解决方案”。 aaa1是一个索引,包含en\u meros、en\u ref、en\u se SELECT en_family FROM entries INDEXED BY aaa1 WHERE (en_meros<>6) AND (en_ref=0) AND (en_se=1) AND (en_lect LIKE "% abcd%" OR en_lect LIKE "abcd%") 一个仍然很慢(约200ms),但比没有索引更好的解决方案是: SELECT

下面的查询抛出“无查询解决方案”。 aaa1是一个索引,包含
en\u meros、en\u ref、en\u se

SELECT en_family
FROM entries INDEXED BY aaa1
WHERE (en_meros<>6) AND (en_ref=0) AND (en_se=1) AND (en_lect LIKE "% abcd%" OR en_lect LIKE "abcd%")
一个仍然很慢(约200ms),但比没有索引更好的解决方案是:

SELECT en_family
FROM entries INDEXED BY aaa1
WHERE (en_meros<6 OR en_meros>6) AND (en_ref=0) AND (en_se=1) AND (en_lect LIKE "% abcd%" OR en_lect LIKE "abcd%")
选择en_族
从由aaa1索引的条目
其中(en_meros6)和(en_ref=0)和(en_se=1)和(en_选择类似于“%abcd%”或en_选择类似于“abcd%”)
一个仍然很慢(~200ms),但比没有索引更好的解决方案是:

SELECT en_family
FROM entries INDEXED BY aaa1
WHERE (en_meros<6 OR en_meros>6) AND (en_ref=0) AND (en_se=1) AND (en_lect LIKE "% abcd%" OR en_lect LIKE "abcd%")
选择en_族
从由aaa1索引的条目
其中(en_meros6)和(en_ref=0)和(en_se=1)和(en_选择类似于“%abcd%”或en_选择类似于“abcd%”)

如查询计划文档(和)中所示,不可能使用索引来搜索具有不等式比较的列值

写入aaa1索引的
不会改变这一点;“无查询解决方案”意味着根本不可能使用该索引,即使是以缓慢的方式也不行


只有两个相等比较可以通过索引加快,因此通过在这些列上创建索引,您可以获得最大的改进:

CREATE INDEX aaa2 ON entries(en_ref, en_se);
找到索引项后,仍必须查找相应的表行。为避免此额外步骤,您可以改为创建一个在查找列之后还包含查询必须读取的所有其他列的:

CREATE INDEX aaa3 ON entries(en_ref, en_se, en_lect, en_meros, en_family);


一般来说,您不应该使用由
索引的
;仅当查询计划器在两个索引之间进行选择,并且恰好选择了错误的索引时,此选项才有用。

如查询计划文档(和)中所示,无法使用索引来搜索具有不等式比较的列值

写入aaa1索引的
不会改变这一点;“无查询解决方案”意味着根本不可能使用该索引,即使是以缓慢的方式也不行


只有两个相等比较可以通过索引加快,因此通过在这些列上创建索引,您可以获得最大的改进:

CREATE INDEX aaa2 ON entries(en_ref, en_se);
找到索引项后,仍必须查找相应的表行。为避免此额外步骤,您可以改为创建一个在查找列之后还包含查询必须读取的所有其他列的:

CREATE INDEX aaa3 ON entries(en_ref, en_se, en_lect, en_meros, en_family);


一般来说,您不应该使用由
索引的
;只有当查询计划器在两个索引之间进行选择,并且碰巧选择了错误的索引时,它才有用。

可能是因为
en\u meros6
的行比
en\u meros=6
的行多,因此,获取这些行需要时间?MySQL和SQLite是两种不同的rdbms产品。请只使用相关的产品标签。盲目随意更改是没有用的。显示数据库架构。@CL.刚刚添加它可能是因为
en_meros 6
的行比
en_meros=6
的行多,因此,获取这些行需要时间?MySQL和SQLite是两种不同的rdbms产品。请只使用相关的产品标签。盲目随意更改是没有用的。显示数据库架构。@CL.刚刚添加了它。在索引中将
en\u meros
(一个int)放在
en\u select
(一个字符串)之前可能会有所不同吗?这里和SQLite邮件列表上的一般“好建议”是首先放置“小”列,但由于在索引搜索期间不会使用它,而且所有字段都将被读取,可能不会。只有在后面的列没有被实际读取时,这才有区别,并且非常大,以至于页面溢出。在索引中将
en\u meros
(一个int)放在
en\u lect
(一个字符串)之前可能会有所不同吗?这里和SQLite邮件列表上的一般“好建议”是首先放置“小”列,但由于在索引搜索期间不会使用它,而且所有字段都将被读取,可能不会。只有当后面的列没有被实际读取,并且太大以至于页面溢出时,这才会产生影响。