这个选择查询可以在移动设备上进行更多优化吗?

时间:2010-02-12 14:18:05

标签: c# optimization sqlite windows-mobile mobile

我们有一个带有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。

此选择查询是否可以在移动设备上进行更多优化?

2 个答案:

答案 0 :(得分:1)

问题是where..like子句中的初始%。索引不能在查询中使用,因此表扫描是唯一可以完成的方法。添加类别ID会有所帮助 - 至少它可以使用该索引。

答案 1 :(得分:0)

您可以使用EXPLAIN检查索引是否实际使用。我猜想like '%5204d%'开头的通配符会禁用invitem上任何索引的使用。