SQLite 中有一张表 Table ,大约 30 个字段,该表不超过 50 万条数据。
现要做一个查询,其中条件涉及到 6 个字段信息:
Select * from Table
Where (f1==true || f2>0 || f3>0) && f4==true && f5!=null && f6==false
这种情况如何设计索引比较好?
1
Woood 2023-09-26 01:13:22 +08:00
根据逻辑维护一个单独的字段然后给它索引。
|
2
iseki 2023-09-26 08:04:02 +08:00 via Android
条件是死的么,不知道 SQLite 有没有这种功能,尝试创建一个表达式索引
|
3
andytao 2023-09-26 08:12:50 +08:00
1 、如果这些查询条件是常态化的,可以把他们组合在一个索引实例里面,约重要的靠前;
2 、如果主要用某一两个,就建包含这两个字段的索引就好了 3 、一些非关键的索引,客户端内存索引是一个更快的选择; [袋鼠数据库工具] 持续创新,欢迎体验。。。 |
4
dw2693734d 2023-09-26 08:42:23 +08:00
为了提高查询性能,你可以创建组合索引或多个单列索引。但是,需要考虑到 SQLite 的查询优化器可能不会使用多个索引。
1. 选择被最频繁用作过滤条件的字段作为组合索引的第一列。 2. 在涉及范围查询(如 `>` 或 `<`)的字段上创建单独的索引可能更有用。 假设 `f4` 和 `f6` 是最常用于过滤的字段,可能的索引设计如下: ```sql -- 组合索引 CREATE INDEX idx_f4_f6 ON Table (f4, f6); -- 单列索引 CREATE INDEX idx_f1 ON Table (f1); CREATE INDEX idx_f2 ON Table (f2); CREATE INDEX idx_f3 ON Table (f3); CREATE INDEX idx_f5 ON Table (f5); ``` 注意:这只是一个例子,实际效果需要通过执行计划和性能测试来验证。 |
5
gaifanking 2023-09-26 09:01:06 +08:00
要明白最左前缀原理,另外 true false 这种建索引性能不好,f2 f3 可以。建议如下:
1 修改 sql ,f2 f3 这种范围比较的放前面,true false null 判断放后面 2 修改后从左边开始任意选择连续的 n 个字段建立索引即可。 |
6
sweat89 2023-09-26 15:32:24 +08:00 1
@dw2693734d 别用 chatgpt 来回复,会被封号的
|
7
dw2693734d 2023-09-26 18:00:46 +08:00
@sweat89 多谢大哥提醒
|
8
James369 OP @dw2693734d 为何和我查的结果不大一样,先试试,呆会再来汇报
|
9
James369 OP @iseki 条件是死的,还真有表达式索引 https://www.sqlite.org/expridx.html
|