Indexeddb缓慢检索问题

时间:2015-02-24 10:45:00

标签: javascript indexeddb

您好,我的应用程序(目前仍在开发中)是一个索引数据库,在一个集合中有400条记录。

索引包括:id,vendor,price,model和subCategoryID。

以下是记录样本:

{
 id: 199,
 bundles: [235,548,983,918],
 categoryID:0 ,
 subCategoryID: 7,
 imageUrl : "/mock/mobiles/Alcatel-One-Touch-Pop-S7.png"
 model: "One Touch pop S7"
 vendor: "Alcatel",
 price: [213.4],
 tag:[],
 productTexture: "data:image/png;base64,iVBORw......",
 alphaMap: "data:image/jpeg;base64,/9j/4AAQSk...."
}

(productTexture和alphamap是base64图像字符串,用于三个目的)。

我正在实施产品过滤的用户界面,我想要使用特定的" subCategoryID"来检索集合中的所有产品。我用以下方法完成了这个:

Store.prototype.getSubCategoryProducts = function ( subCategoryID, callback ) {

    console.time( "getSubCategoryProducts" );
    var results = [];
    var transaction = this.db.transaction( [ this.config.collection ], "readonly" );
    var store = transaction.objectStore( this.config.collection );
    var index = store.index( "subCategoryID" );

    index.openCursor().onsuccess = function ( evt ) {

        var cursor = evt.target.result;

        if ( cursor ) {

            if ( cursor.value.subCategoryID === subCategoryID ) {
                results.push( cursor.value );
            }

            cursor.continue();

        } else {
            console.timeEnd( "getSubCategoryProducts" );
            callback( results );
        }

    };

};

然而,在我测试我的方法之后我观察到的是它非常慢...... 我的控制台中输出console.TimeEnd()getSubCategoryProducts: 11759.143ms

我相信12秒真的很慢。 是否有我遗漏的东西或我在这里做错的任何事情,还是因为每个对象都有base64图像字符串?即便如此,我想12秒是不可接受的。

如果我的方法有问题或者有任何改进的余地,请告诉我。

更新

经过一番思考后,我添加了一个导致改进的范围。请求现在 需要3秒但仍然很慢。

以下是新方法:

Store.prototype.getSubCategoryProducts = function ( subCategoryID, callback ) {

    console.time( "getSubCategoryProducts" );
    var results = [];
    var transaction = this.db.transaction( [ this.config.collection ], "readonly" );
    var store = transaction.objectStore( this.config.collection );
    var boundKeyRange = IDBKeyRange.only( subCategoryID );
    var index = store.index( "subCategoryID" );

    index.openCursor( boundKeyRange ).onsuccess = function ( evt ) {

        var cursor = evt.target.result;

        if ( cursor ) {

            results.push( cursor.value );
            cursor.continue();

        } else {
            console.timeEnd( "getSubCategoryProducts" );
            callback( results );
        }

    };

};

1 个答案:

答案 0 :(得分:1)

您遇到的问题是将文件存储在数据库中,这肯定会降低Indexeddb性能,尤其是在移动设备上。

有两种不同的解决方案,我可以想到:

  • 一种是传统的从表中删除图像数据(productTexturealphaMap),并将它们存储在磁盘上的某个位置,并在数据库中保留它的链接。
  • 第二种解决方案是将图像中的其余数据分成两个表。将productTexturealphaMap存储在与其他数据不同的表中。然后,获取类别中的产品的查询将非常快速地执行,显示占位符,以便用户感觉某些东西正在移动应用程序,然后向存储图像的表格发出多个请求,并在加载时显示它们。 / LI>