查询会根据结果集的大小进行缩放,而不是数据集的大小

Sam*_*ath 3 firebase ionic3 angular google-cloud-firestore

这是关于最新的Firebase Cloud Firestore的问题.在这个文档中,它是这样说的:

它还允许表达性查询.查询按结果集的大小进行缩放,而不是数据集的大小,因此您将获得相同的性能,从100或100,000,000的集合中获取1个结果.

这个陈述对我来说并不清楚.你能解释一下这个用例吗?

Fra*_*len 16

这里有一个firebaser

在大多数数据库(包括Firebase自己的实时数据库)中,查询性能取决于您请求的项目数和您请求项目的集合大小的组合.

所以:

  1. 如果您要求100个项目中的10个项目,那么比您在100万个项目中请求1000个项目要快.
  2. 如果您要求100个项目中的10个项目,那么比您在1亿个项目中请求10个项目要快.

预计#1的性能差异,仅数据传输是难以忘记的.由于#2取决于服务器端处理,开发人员有时会忘记#2.许多关系DBMS非常好地优化,意味着性能差异通常是对数性能差异.但是,如果收集尺寸足够大,即使log(n)性能也会显着提升.

Cloud Firestore水平扩展,这意味着上面的规则#2不适用:

  • 如果您要求100个项目中的10个项目,则需要与请求10个项目中的10个项目相同的时间.

这是因为Firestore的查询系统的设计方式.虽然您可能无法将每个查询直接从关系数据模型建模到Firestore数据模型,但如果您可以根据Firestore查询定义用例,则可以保证在相对于数量的时间内执行你要求的结果.(在这里解释吉尔的评论)

  • 另一种说法是Firestore查询旨在避免服务器上的多余工作.其他数据库系统,尤其是基于SQL的数据库系统,允许更复杂的查询,但是查询可能会爆炸并且性能会下降.此语句是一种承诺:如果您可以表达查询,Firestore将只执行与结果集大小成比例的工作. (5认同)

Dav*_*vid 5

这可能写得有些混乱.它不是典型意义上的用例,只是关于Firestore性能的声明.

它基本上说如果你从100.000.000中的100或1项中请求1项并不重要,它将同样快.这里1是你的结果集,100/100.000.000是你的数据集.因此,从100.000.000中请求1项将比请求100项中的50项更快.

我希望这会让它更清晰一些!

  • 这就是我最后一句话应该解释的。如果您请求更多项目(结果集),您的查询会变得更加昂贵,但如果有更大的可用数据集则不会。只要您始终请求相同数量的项目,无论您的数据集有多大,查询都将始终具有相同的性能。 (2认同)