LIKE 和 GROUP BY 的 sqlite3 复合索引用法
sqlite3 compound index usage for LIKE and GROUP BY
我似乎无法让 sqlite3 不使用带有复合索引的 TEMP B-TREE 来进行带有 LIKE 子句和 GROUP BY 子句的查询。似乎只为 WHERE 子句使用索引。由于 LIKE 不区分大小写,因此我尝试在索引中使用 COLLATE NOCASE 的所有组合制作索引。
示例如下,索引为 foo、boo。
SELECT foo, boo FROM mytable WHERE foo LIKE 'hi%' GROUP BY boo;
还尝试使用子查询,例如
SELECT foo, boo FROM (SELECT foo, boo FROM mytable WHERE foo LIKE 'hi%') GROUP BY boo;
有趣的是,ORDER BY 在上面类似的子查询情况下工作,但也不适用于直接查询。
感谢任何帮助!
> CREATE TABLE mytable(foo, boo, [...]);
> CREATE INDEX bfi ON mytable(boo, foo COLLATE NOCASE);
> EXPLAIN QUERY PLAN SELECT foo, boo FROM mytable WHERE foo LIKE 'hi%' GROUP BY boo;
0|0|0|SCAN TABLE mytable USING COVERING INDEX bfi
我似乎无法让 sqlite3 不使用带有复合索引的 TEMP B-TREE 来进行带有 LIKE 子句和 GROUP BY 子句的查询。似乎只为 WHERE 子句使用索引。由于 LIKE 不区分大小写,因此我尝试在索引中使用 COLLATE NOCASE 的所有组合制作索引。
示例如下,索引为 foo、boo。
SELECT foo, boo FROM mytable WHERE foo LIKE 'hi%' GROUP BY boo;
还尝试使用子查询,例如
SELECT foo, boo FROM (SELECT foo, boo FROM mytable WHERE foo LIKE 'hi%') GROUP BY boo;
有趣的是,ORDER BY 在上面类似的子查询情况下工作,但也不适用于直接查询。
感谢任何帮助!
> CREATE TABLE mytable(foo, boo, [...]);
> CREATE INDEX bfi ON mytable(boo, foo COLLATE NOCASE);
> EXPLAIN QUERY PLAN SELECT foo, boo FROM mytable WHERE foo LIKE 'hi%' GROUP BY boo;
0|0|0|SCAN TABLE mytable USING COVERING INDEX bfi