如何构建数据存储索引 (PHP GAE)

How to build datastore indexes (PHP GAE)

我正在使用 Tom Walder's Google Datastore Library for PHP 将数据插入我的 Google App Engine 数据存储区。

$obj_schema = (new GDS\Schema('Add Log'))
    ->addString('name', TRUE)
    ->addDatetime('time', TRUE);
$obj_store = new GDS\Store($obj_gateway, $obj_schema);
$obj_store->upsert($obj_store->createEntity(['name' => "test",'time' => date('Y-m-d H:i:s', time())]));

当我像上面的代码一样插入数据时,一切似乎都在正确导入(每个 属性 都说它们已编入索引)。

但是当我使用多个选择器进行查询时,它显示 "You need an index to execute this query"。

我的查询

错误信息

有谁知道我需要做什么来确保我的查询被编入索引?这就是我的仪表板如何使用我展示的代码处理大量数据。

正如 Alex Martelli 在评论中提到的那样,大多数时候,当您 运行 开发服务器上的应用程序并在那里查询您的数据存储时,您的索引就会建立(这会为任何问题添加所需的索引进入您的 index.yaml 文件。

所以你有两种方法可以做到这一点。

1- 运行 你在本地开发服务器上的应用程序,转到你的开发“Developer Console" to add one or two entities to your datastore. Run your queries, that'll populate your index.yaml with all required indexes. You can then run appcfg.py update_indexes to just deploy your index.yaml (bottom of this page)

2- 您的另一个解决方案是阅读 this, a page on how datastore indexes work. Then read this advanced article on indexes. You should also watch the following presentation,这将使您更好地了解索引和数据存储。一旦这一切都完成了,找出你想要的查询,并在你的 index.yaml 中充实所需的索引,然后使用与 1.

中相同的方法进行部署

索引如何工作的快速总结

因此您可以将数据存储视为纯粹的 READER。它不像普通的关系数据库那样,在读取数据和 returns 数据时不进行任何类型的计算。因此,为了能够 运行 一个给定的查询(比如 "all client orders passed before christmas 2013"),那么你需要一个 table,其中你所有的客户订单都按日期排序(这样系统就不必检查每一行的日期以查看它是否匹配。它只需要您数据的第一个 "chunk",直到您要查找的日期,然后 returns 它)。

因此,您需要建立这些索引,它们会影响您可以进行的查询运行。默认情况下,每个属性都按降序自行索引。对于超过一个属性(或具有不同排序顺序)的任何查询,您需要拥有由数据存储构建的索引(在这种情况下称为 composite indexes),因此您需要在 index.yaml.

在过去的几年中,Google 添加了 zigzag merge join algorithm,这基本上是一种采用 2 个复合索引的方法(以相同的属性开始,因此 2 个子索引之间有共同点-queries) 和 运行 2 个子查询,然后让算法加入两个子查询的响应。