如何为多条件查询设计数据库(sqlite)?

时间:2012-08-26 08:01:56

标签: sqlite database-design

假设将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

如何设计表格以进行最快速的查询? (只是查询,不关心插入/更新/删除)

谢谢!

1 个答案:

答案 0 :(得分:1)

  

典型的查询操作类似于从t_table中选择d,其中c1 ='UA1000_2048X32_MCSYN',c2 ='1.234',c3 ='2.345';

那么,你只需要{c1, c2, c3}上的综合索引。

理想情况下,您还需要cluster表,因此检索d只涉及没有表堆访问的索引查找,但我不认为SQLite支持群集。或者,请考虑在{c1, c2, c3, d}上创建covering索引。


  

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;