2014-10-03 91 views
4

Apple最近在OSX上的iOS8 Safari和Safari 7.1中增加了对indexeddb的支持。我试图在一个Web应用程序中使用它,该应用程序在indexeddb中存储大约65,000条记录,并使用一些复合索引来查询它们。indexeddb的Safari实施非常缓慢

它对我很有用,但与Chrome的indexeddb实现相比,它确实很慢。

具体而言...一个针对Chrome的indexeddb需要2ms的查询需要500ms针对Apple的indexedbb。此特定查询使用复合索引数据库索引(密钥中的2个字段),使用该密钥的IDBKeyRange.only值可带回总计65,000个约100个文档。

我的应用程序也支持websql作为存储机制,当我切换到Safari时,性能非常好。我的查询将在几ms内返回,就像Chrome一样。

其他任何人遇到Apple的indexeddb执行缓慢的麻烦?关于如何使其更好地工作或者我们只需等待Apple解决它的任何建议?

我相信Apple的indexeddb实现实际上只是websql的一个包装,而且我可以直接用性能良好的websql实现我的应用程序,这意味着如果实现的很好,这样的包装应该可以正常工作。可悲的是,情况并非如此!

+1

更新...我安装了iOS9 beta,其中包含Safari 9和indexeddb已修复!性能很好,其关键和其他错误的问题已消失。我测试了1.5GB的JSON文件,一切都很好。另外,50MB的数据大小限制消失了,并且没有提示用户存储数据。 – Category6 2015-07-30 20:29:06

+0

更新2.我说得太快了。 iOS9的indexeddb稍微好一点,因为50MB的限制消失了,一些bug已经修复,但是一旦你的文档超过了几千个,性能仍然很糟糕。索引查询的响应时间超过5秒。如果您的文档不止一个,则无法使用。 – Category6 2015-10-16 13:37:59

回答

2

我们已经看到了同样的事情。插入10000个对象的过程需要大约5或6秒才能在Android上完成,并需要15分钟才能在iOS8上完成。

Safari是一个webkit浏览所以如果它使用相同的代码库,因为这:

https://github.com/WebKit/webkit/blob/master/Source/WebKit2/DatabaseProcess/IndexedDB

然后索引资料是(严重)基于SQLLite数据库。

+0

Firefox的indexeddb实现也是基于致敬,但性能良好。 – 2014-11-11 01:00:36

0

我也有这个问题。但我也发现桌子越大越慢。我需要保存大约30,000条记录,从服务器获得大约2000部分的记录,然后插入。每个批次插入的速度都比前一个慢,直到花费80分钟才能插入。我们提出的解决方案(它非常丑陋)是为每个同步部分创建一个单独的对象存储。然后你必须处理查询多个对象/等。但它确实使它可用。

直到苹果得到他们的indexeddb实现整理出来,这是我有最好的解决方案。

+0

出于兴趣,我们遇到类似的时间问题。您最终创建了多少(大约)个对象商店? – 2015-01-21 09:13:37

+0

我将它设置为动态,我认为它将每个商店的最大记录数设置为2000,然后转到下一个。它们通过id在服务器上查询,然后插入到它们自己的对象库中。g select * where id> 0 AND id <2000; – 2015-01-21 19:26:51

+0

因此,我认为目前它正在生成类似于16个对象存储库的产品和我们正在使用的生产数据。请注意,取决于每个id是否存在/活动/ etc等所有记录,某些对象存储只有更接近1500,而其他对象存储完全满 – 2015-01-21 20:59:27