sql - 此表和查询的最佳索引?

标签 sql sqlite

我有一个必须尽快运行的 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 的每个组合创建索引, rsetfrequency找到最佳情况,但您必须然后在您的表中有真实数据。
- ( 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/

相关文章:

linux - MS Access *.MDB 转换为 MySQL 或 SQLite,数据编码问题

Django - 生产中的内存sqlite

sql - 从插入语句sql中获取值

sql - 转换所选结果的日期格式

php - 在另一个sql查询中使用查询结果

python - 将 sqlite3.cursor 转换为 int PYTHON

javascript - Node.js 中的异步循环

php - 在 SELECT 查询之后的 while 循环之前检查 num_rows 有什么用处?

windows - VACUUM 导致磁盘运行 100% - 这是否正常,我可以阻止它吗?

c# - SQLite3 - "Unable to open database"