objectForPrimaryKey 与过滤查询(匹配主键)性能,哪个对大数据更快?

Posted

技术标签:

【中文标题】objectForPrimaryKey 与过滤查询(匹配主键)性能,哪个对大数据更快?【英文标题】:objectForPrimaryKey vs filtered query(to match primary key) performance, which one is faster for large data? 【发布时间】:2021-03-19 10:25:05 【问题描述】:

这里我举个例子

class TestRealm 
    constructor(realmDB) 
        this.realmDB = realmDB;
        this.allRealm = this.realmDB.objects('Person');
    

    query1(primary_key) 
        try 
            const response = this.allRealm.filtered(`_id == "$primary_key"`);
            if (response.length === 0) 
                console.log('unable to find');
                return;
            
            return response.toJSON()[0];
        
        catch (e) 
            console.log(e);
        
    

    query2(primary_key) 
        try 
            const response = this.realmDB.objectForPrimaryKey('Person', `"$primary_key"`);
            if (!response) 
                console.log('unable to find');
                return;
            
            return response.toJSON();
        
        catch (e) 
            console.log(e);
        
    

假设打开领域后,我将领域对象传递给 TestRealm 构造函数。在这种情况下,哪种查询对大数据有效?

【问题讨论】:

【参考方案1】:

让我们从排列术语开始

这是一个查询(又名过滤器),将返回一个领域结果对象

const response = this.allRealm.filtered(`_id == "$primary_key"`);
        

不是查询,将返回该特定对象

const response = this.realmDB.objectForPrimaryKey('Person', `"$primary_key"`);

所以你返回了两个不同的东西——第一个例子中的response 是一个实时更新的领域结果对象,所以它比返回对象本身有更多的开销。

另请注意,对于“大数据”,第二个选项基本上不受数据集大小的影响(一般而言)

第二个例子要快得多。

【讨论】:

嗨杰,谢谢你的回复,但我有疑问....在第一个响应中,我将获得只有一个领域对象的领域结果对象(因为 primary_key 是唯一的),在第二个响应中我'将只获得一个领域对象。所以我的问题是对于大数据,哪个更快(object.filtered 或 objectForPrimaryKey)?注意:在两个查询中,我都在转换为 JSON() 后返回,因此返回的对象不再是实时对象。 @PrahladSinghNegi 第一个例子可以返回很多对象;过滤器不知道它的过滤内容,它只会返回与过滤器匹配的所有对象。而第二个示例将永远返回一个特定对象。如答案中所述,第二个示例“快得多”,数据集的大小不会影响其性能。我们对此进行了大量测试,因为我们的数据集通常为 2Gb 或更大。

以上是关于objectForPrimaryKey 与过滤查询(匹配主键)性能,哪个对大数据更快?的主要内容,如果未能解决你的问题,请参考以下文章

SOLR 过滤器查询与主查询

查询与过滤器

Django 查询集过滤,将字段与字段进行比较

Elasticsearch 查询与过滤

过滤与另一个表匹配的查询

将 ArrayFormula 与查询或过滤器一起使用