数据库多条件查询索引如何设计比较好?

2023-09-25 23:28:09 +08:00
 James369

SQLite 中有一张表 Table ,大约 30 个字段,该表不超过 50 万条数据。

现要做一个查询,其中条件涉及到 6 个字段信息:

Select * from Table 
Where (f1==true || f2>0 || f3>0) && f4==true && f5!=null && f6==false

这种情况如何设计索引比较好?

1487 次点击
所在节点    程序员
10 条回复
Woood
2023-09-26 01:13:22 +08:00
根据逻辑维护一个单独的字段然后给它索引。
iseki
2023-09-26 08:04:02 +08:00
条件是死的么,不知道 SQLite 有没有这种功能,尝试创建一个表达式索引
andytao
2023-09-26 08:12:50 +08:00
1 、如果这些查询条件是常态化的,可以把他们组合在一个索引实例里面,约重要的靠前;
2 、如果主要用某一两个,就建包含这两个字段的索引就好了
3 、一些非关键的索引,客户端内存索引是一个更快的选择;

[袋鼠数据库工具] 持续创新,欢迎体验。。。
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);
```

注意:这只是一个例子,实际效果需要通过执行计划和性能测试来验证。
gaifanking
2023-09-26 09:01:06 +08:00
要明白最左前缀原理,另外 true false 这种建索引性能不好,f2 f3 可以。建议如下:
1 修改 sql ,f2 f3 这种范围比较的放前面,true false null 判断放后面
2 修改后从左边开始任意选择连续的 n 个字段建立索引即可。
sweat89
2023-09-26 15:32:24 +08:00
@dw2693734d 别用 chatgpt 来回复,会被封号的
dw2693734d
2023-09-26 18:00:46 +08:00
@sweat89 多谢大哥提醒
James369
2023-09-26 20:33:31 +08:00
@dw2693734d 为何和我查的结果不大一样,先试试,呆会再来汇报
James369
2023-09-26 20:37:23 +08:00
@iseki 条件是死的,还真有表达式索引 https://www.sqlite.org/expridx.html
iseki
2023-09-26 22:07:57 +08:00
@James369 大大小小数据库,可能也就 MySQL 要啥没啥了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/977113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX