gpt4 book ai didi

android - 使用 IFNULL 会阻止 SQLite 使用索引吗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:12 24 4
gpt4 key购买 nike

假设我有一个表 T 和字段 f 的索引。我想根据一些整数 myF 过滤 f。如果整数为 0,我想要所有 fnull 的记录。一个肯定的写法是:

db.rawQuery("SELECT someField FROM T WHERE "
+ (myF == 0 ? "f IS NULL" : "f = ?"),
(myF == 0 ? new String[] {}, new String[] {String.valueOf(myF)}));

这有点不方便;特别是如果查询比这更复杂并且有额外的参数。所以我想我会写

db.rawQuery("SELECT someField FROM T WHERE IFNULL(f, 0) = ?", 
new String[] {String.valueOf(myF)});

相反,它更简单、更易于阅读且更易于维护。¹

我的问题是:如果 f 上有索引,SQLite 是否仍会使用该索引,还是会求助于表扫描?我问是因为在在后一种情况下,我不是在比较字段和参数,而是在比较表达式 和参数,而且我不确定 SQLite 查询优化器有多“智能”。


¹ 请注意,数据库中没有包含 f = 0 的记录。

最佳答案

这将导致表扫描。

使用 sqlite3 命令行客户端的示例:

sqlite> create table t(f);
sqlite> create index tf on t(f);
sqlite> explain query plan select * from t where ifnull(f,0)=1;
0|0|0|SCAN TABLE t (~500000 rows)
sqlite> explain query plan select * from t where f is null;
0|0|0|SEARCH TABLE t USING COVERING INDEX tf (f=?) (~10 rows)
sqlite> explain query plan select * from t where f=1;
0|0|0|SEARCH TABLE t USING COVERING INDEX tf (f=?) (~10 rows)

关于android - 使用 IFNULL 会阻止 SQLite 使用索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22812602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com