我们有一个带有SQLite数据库的C#移动应用程序。 我们拥有更大的库存数据库,例如30k或100k物品。闪存卡上的数据库文件为12MB。
使用限制运行更简单的SELECT查询需要10-15秒。
select id,invitem,invid,cost from inventory
where itemtype = 1 and
(invitem like '%5204d%' or invid like '%5204d%')
limit 25
有时也涉及一个类别,
select id,invitem,invid,cost from inventory
where itemtype = 1 and
categoryid=147 and
(invitem like '%5204d%' or invid like '%5204d%')
limit 25
索引创建于:
cmd.CommandText = "CREATE INDEX IF NOT EXISTS idx_inventory_categoryid ON " + this.TableName + " (categoryid);";
cmd.ExecuteNonQuery();
cmd.CommandText = "CREATE INDEX IF NOT EXISTS idx_inventory_itemtype ON " + this.TableName + " (itemtype);";
cmd.ExecuteNonQuery();
cmd.CommandText = "CREATE INDEX IF NOT EXISTS idx_inventory_invitem ON " + this.TableName + " (invitem);";
cmd.ExecuteNonQuery();
Like中的这两个字段是VARCHAR,其他字段是NUMERIC。
此选择查询是否可以在移动设备上进行更多优化?
答案 0 :(得分:1)
问题是where..like子句中的初始%。索引不能在查询中使用,因此表扫描是唯一可以完成的方法。添加类别ID会有所帮助 - 至少它可以使用该索引。
答案 1 :(得分:0)
您可以使用EXPLAIN
检查索引是否实际使用。我猜想like '%5204d%'
开头的通配符会禁用invitem
上任何索引的使用。