【发布时间】:2023-04-11 11:07:01
【问题描述】:
对于带有 LIKE 子句和 GROUP BY 子句的查询,我似乎无法让 sqlite3 不使用带有复合索引的 TEMP B-TREE。似乎只使用 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 INDEX mytable_idx2 ON mytable(boo, foo);进行了覆盖索引扫描 -
我已经尝试了所有组合。
CREATE INDEX mytable_idx1 ON mytable(boo COLLATE NOCASE, foo);CREATE INDEX mytable_idx2 ON mytable(boo, foo COLLATE NOCASE);CREATE INDEX mytable_idx3 ON mytable(boo COLLATE NOCASE, foo COLLATE NOCASE);CREATE INDEX mytable_idx4 ON mytable(boo, foo); -
哪个 SQLite 版本?
标签: sql sqlite group-by sql-like