我有一个必须尽快运行的 sqlite 查询。查询相当简单,但我不知道为表编制索引以获得最佳性能的最佳方法。
该表称为“词典”。定义是:
_id integer primary key
word text
frequency integer
lset integer
rset integer
查询是:
SELECT word,frequency FROM lexicon WHERE lset>? AND rset<? ORDER BY frequency DESC LIMIT ?
我已经为所有单独的列编制了索引,但我怀疑复合索引可能更好,但是什么组合呢? lset和rset的索引应该升序还是降序?
编辑: lset 和 rset 是表示树结构的嵌套集合值。因此,lset 和 rset 的所有值都是相互唯一的,并且是完美分布的。此外,在任何给定的行中,lset < rset。
提前致谢...
最佳答案
这将取决于您的数据统计。
您可以尝试为 lset
的每个组合创建索引, rset
和 frequency
找到最佳情况,但您必须然后在您的表中有真实数据。
- ( lset
, rset
, frequency
)
- ( rset
, lset
, frequency
)
- ( lset
, frequency
, rset
)
- ( rset
, frequency
, lset
)
- ( frequency
, lset
, rset
)
- ( frequency
, rset
, lset
)
拥有frequency
的优势首先是它已经为你的 ORDER BY
准备好了和 LIMIT
条款。
但是,如果您词典中的每个词碰巧都有不同的频率,那么索引中的第二个和第三个字段将变得毫无值(value)。 (数据统计为何重要的示例。)
哪个字段将限制您最快的记录也很重要。如果lset < x
过滤器将集合缩减为 0.01%
原始大小,将该过滤器放在索引的第一位。
但很有可能,过滤 lset < X and rset > y
根本不可能很好地编制索引。
关于sql - 此表和查询的最佳索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705645/