假设将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
如何设计表格以进行最快速的查询? (只是查询,不关心插入/更新/删除)
谢谢!
答案 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;