【问题标题】:sqlite3 compound index usage for LIKE and GROUP BYLIKE 和 GROUP BY 的 sqlite3 复合索引用法
【发布时间】: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


【解决方案1】:
> 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 吗?
  • 谢谢,对于没有发现它的任何人,按列分组实际上是索引中的第一个。我觉得很奇怪,但你去吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多