2017-09-24 66 views
0

我在我的反應原生應用程序中設置了類似下面的代碼來爲性能測試設置模擬/測試數據。提高react-native中領域查詢的速度?

realm.write(() => { 
    const max = 120; 
    for(let x=1; x<=max; x++) 
    { 
     realm.create('Product', {productId:x}); 
    } 

    for(let x=1; x<=max; x++) 
    { 
     for(let y=x; y<=max; y++) 
     { 
      for(let z=y; z<=max; z++) 
      { 
       realm.create('Compatibility', { 
        result: 'Y '+x+' '+y+' '+z, 
        products: [ 
        realm.objects('Product').filtered('productId = '+x)[0], 
        realm.objects('Product').filtered('productId = '+y)[0], 
        realm.objects('Product').filtered('productId = '+z)[0] 
        ] 
       }); 
      } 
     } 
    } 
}); 

class Product {} 
Product.schema = { 
    name: 'Product', 
    primaryKey:'productId', 
    properties: { 
     productId:'int' 
    } 
}; 

class Compatibility {} 
Compatibility.schema = { 
    name: 'Compatibility', 
    properties: { 
     result: {type: 'string'}, 
     products: {type: 'list',objectType:'Product'}, 
    } 
}; 

這意味着Products對象有120條記錄,Compatibility對象有170條記錄。

當我運行查詢realm.objects('Compatibility').filtered(products.productId = 3 AND products.productId = 25 AND products.productId = 97)時,大約需要15秒鐘才能在我的舊HTC Desire 510和我的華爲Nova Plus上運行。這太慢了。

有沒有提高查詢速度的方法?例如,你可以索引列或什麼?

回答

0

首先在領域索引和primaryKeys已被索引。因此,在這種情況下建立索引不會對您有所幫助。但是我認爲我有一個想法,就是如何讓這個過程更快。

在最後for循環你正在做3個查詢。其中2人不必要地發生我認爲,因爲xy值將相同的值爲120 z值。如果你實現類似下面的代碼,這可能會對我的性能有所幫助。

let productX; 
let productY; 
let productZ; 

for (let x = 1; x <= max; x++) 
{ 
    productX = realm.objects('Product').filtered('productId = ' + x)[0]; 
    for (let y = x; y <= max; y++) 
    { 
     productY = realm.objects('Product').filtered('productId = ' + y)[0]; 
     for (let z = y; z <= max; z++) 
     { 
      productZ = realm.objects('Product').filtered('productId = ' + z)[0]; 
      realm.create('Compatibility', 
      { 
       result: 'Y ' + x + ' ' + y + ' ' + z, 
       products: [ productX, productY, productZ] 
      }); 
     } 
    } 
} 

雖然;

這可能是一個非常糟糕的主意,可能是一個可怕的做法,但我會給作爲一個思想實踐。

如果你總是在做查詢3個不同productId S,你可以在一個單一的財產和查詢只創造了所有樹的字符串。這樣你可以使用索引。作爲索引

class Compatibility {} 
Compatibility.schema = { 
    name: 'Compatibility', 
    properties: { 
     result: {type: 'string'}, 
     productQueryHelper: { type: 'string', indexed: true } 
     products: {type: 'list',objectType:'Product'}, 
    } 
}; 

realm.create('Compatibility', 
{ 
    result: 'Y ' + x + ' ' + y + ' ' + z, 
    productQueryHelper: `${x}&${y}&${z}` // you can use any other separator that isn't possible to be in productId 
    products: [ 
     realm.objects('Product').filtered('productId = ' + x)[0], 
     realm.objects('Product').filtered('productId = ' + y)[0], 
     realm.objects('Product').filtered('productId = ' + z)[0] 
    ] 
}); 

realm.objects('Compatibility').filtered('productQueryHelper = "3&25&97"') 
+0

我更新了我的問題,以清楚表明我只對查詢性能感興趣。對於您的productQueryHelper,我可以查詢可變數量的productId。有時我在查詢僅1的productId,其他時間我就可以查詢在10周的productId以上。我想productQueryHelper不靈活,以支持可變數量的過濾參數? – John

+0

@John在這種情況下,我不認爲它是。對不起,它沒有幫助。 – bennygenel

0

嘗試設置您的主鍵。

btw我從來沒有使用Realm的性能問題。 現在我在場景中使用Realm來管理我的通知。我有很多查詢在運行,這從來不會影響性能。

class Product {} 
Product.schema = { 
    name: 'Product', 
    primaryKey:'productId', 
    properties: { 
     productId: { type: 'int', indexed: true } 
    } 
}; 

class Compatibility {} 
Compatibility.schema = { 
    name: 'Compatibility', 
    properties: { 
     result: {type: 'string'}, 
     products: {type: 'list',objectType:'Product'}, 
    } 
};