拆分CoreData以加快查询时间

Rob*_*ert 1 sql sqlite iphone core-data ios

我有一个巨大的核心数据数据库,包含地图上路径的经度和纬度.

我有一个叫做方式的对象,它由一组有序的节点组成(lon,lat).我还将封闭盒存放在路上(minLon,minLat,maxLon,maxLat ......).

数据模型

我的查询在地图的特定区域中查找所有方式:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"minLon < %f AND maxLon > %f AND minLat < %f AND maxLat > %f",
        maxLon, minLon, maxLat, minLat];
Run Code Online (Sandbox Code Playgroud)

它的水坝慢了!

我加快查询的想法是以某种方式将数据按方形区域分割(多个表?多个.sqllite文件?创建位置的哈希值?)因此搜索的数据较少.

我怎样才能做到这一点?

Rob*_*ill 5

  1. 您可以通过将Way实体中的最小/最大值存储为缩放整数而不是浮点数来加快查询速度.选择一个缩放因子,为您提供可接受的区域分辨率,在存储时使用它来预分级值,并在执行查询时使用相同的比例因子.

  2. 您还可以查看将四叉树数据结构添加到核心数据模型,以便在所需区域中的方式中进行归位.

  3. SQlite将在复合谓词失败的第一次测试中拯救,因此首先进行最便宜的测试.

  4. 另请参阅为这4个属性启用索引.

说实话,我很惊讶这很慢.您在数据库中拥有多少总方式,以及您想要查询的区域中通常有多少种方式?

您是否尝试启用SQL调试以查看实际对数据库运行的查询?(提示:在Scheme编辑器中为Run行为添加-com.apple.CoreData.SQLDebug 1作为命令行参数)