0

假设 1000,000 条记录排列为:

c1_v1 c2_v1 c3_v1 d1
c1_v1 c2_v1 c3_v2 d2
c1_v1 c2_v1 c3_v3 d3
...
c1_v1 c2_v2 c3_v1 d999
c1_v1 c2_v2 c3_v2 d1000
...
c1_v999 c2_v999 c3_v998 d999999
c1_v999 c2_v999 c3_v999 d1000000

假设我们需要三个条件(c1_vx, c2_vx, c3_vx)来查询结果(dx),但是不同记录中的单个条件如c1_v1可能相同。记录的另一种样式:

c1_v1
    c2_v1
        c3_v1 : d1
        c3_v2 : d2
        c3_v3 : d3
        ...
    c2_v2
        c3_v1 : d999
        c3_v2 : d1000
    ...
c1_v999
    c2_v999
        c3_v998: d999999
        c3_v1000: d1000000

如何设计用于最快查询的表?(只是查询,不关心插入/更新/删除)

谢谢!

4

1 回答 1

1

一个典型的查询操作就像 select d from t_table where c1 = 'UA1000_2048X32_MCSYN' and c2 = '1.234' and c3 = '2.345';

好吧,那么您只需要在{c1, c2, c3}.

理想情况下,您还会对表进行集群,因此检索d只涉及没有表堆访问的索引查找,但我认为 SQLite 不支持集群。或者,考虑创建一个覆盖索引{c1, c2, c3, d}


c1 是一个类似于 UA1000_2048X32_MCSYN 的字符串,c2 和 c3 是一个实数(双)

我不会尝试在查询中将数字与字符串等同起来——一些 DBMS 在这些情况下不能使用索引,SQLite 可能就是其中之一。相反,只需以最自然的方式编写查询,不要在数字文字周围加上单引号:

select d from t_table
where c1 = 'UA1000_2048X32_MCSYN' and c2 = 1.234 and c3 = 2.345;
于 2012-08-26T10:11:05.037 回答