C# 在移动设备上是否可以进一步优化此选择查询?

C# 在移动设备上是否可以进一步优化此选择查询?,c#,optimization,sqlite,windows-mobile,mobile,C#,Optimization,Sqlite,Windows Mobile,Mobile,我们有一个带有SQLite数据库的C#mobile应用程序。 我们有一个更大的库存数据库,例如3万或10万件物品。闪存卡上的数据库文件为12MB 运行带有限制的更简单的SELECT查询需要10-15秒 select id,invitem,invid,cost from inventory where itemtype = 1 and (invitem like '%5204d%' or invid like '%5204d%') limit 25 有时也会涉及到一个类别

我们有一个带有SQLite数据库的C#mobile应用程序。 我们有一个更大的库存数据库,例如3万或10万件物品。闪存卡上的数据库文件为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,其他字段是数值字段


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

您可以使用它来检查是否实际使用了索引。我猜
开头的通配符,比如“%5204d%”
会禁用对
invitem

上的索引的任何使用,您可以使用它来检查索引是否实际被使用。我想,
开头的通配符,比如“%5204d%”
会禁止在
invitem
上使用索引。问题是where..like子句中的初始百分比。索引不能用于其查询,因此表扫描是唯一的方法。添加类别id将有所帮助-至少它可以在XDEX中使用该id。

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

我可以删除第二个字段
invid的初始%,如“5204d%”
。如何在c#代码中使用此解释?我没有适用于Windows Mobile的SQLite控制台。我想您可以只提交带有EXPLAIN前缀的查询,然后返回一个结果集,其内容确实描述了查询。您还可以将sqlite数据库复制到您的桌面并在那里进行分析。或者至少是一个具有相同架构和数据的文件。我可以删除第二个字段
invid的初始值%,如“5204d%”
。如何在c#代码中使用此解释?我没有适用于Windows Mobile的SQLite控制台。我想您可以只提交带有EXPLAIN前缀的查询,然后返回一个结果集,其内容确实描述了查询。您还可以将sqlite数据库复制到您的桌面并在那里进行分析。或者至少是一个具有相同架构和数据的文件。我可以删除第二个字段
invid(如“5204d%”)的初始%这可能会有所帮助-查询优化器可以在应用invitem筛选器之前使用invid上的索引来缩小可能的匹配。我可以删除第二个字段
invid(如)的初始%“5204d%”
这可能会有所帮助-查询优化器可能能够在应用invitem筛选器之前使用invid上的索引来缩小可能的匹配范围。