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

时间:2015-02-10 04:32:20

标签: php google-app-engine google-cloud-datastore

我正在使用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())]));

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

enter image description here

但是当我用多个选择器进行查询时,它会说"你需要一个索引来执行这个查询"。

我的查询 enter image description here

错误消息 enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:2)

正如Alex Martelli在评论中提到的那样,大多数情况下,当您在devserver上运行应用程序并在那里查询数据存储区时,会构建索引(这会将任何问题所需的索引添加到{{1}中文件。

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

1-在本地devserver上运行您的应用,转到您的开发人员“Developer Console”,将一个或两个实体添加到您的数据存储区。运行您的查询,这将使用所有必需的索引填充index.yaml。然后,您可以运行appcfg.py update_indexes来部署index.yaml(this page的底部)

2-您的另一个解决方案是阅读this,这是一个关于数据存储索引如何工作的页面。然后阅读关于索引的this高级文章。您还应该观看以下presentation,以便更好地了解索引和数据存储区。完成所有操作后,找出所需的查询,并在index.yaml中充实所需的索引,然后使用与1中相同的方法进行部署。

索引如何运作的快速摘要

因此,您可以将数据存储区视为纯读取器。它不像普通的关系数据库那样,在读取数据并返回数据时进行任何计算。因此,为了能够运行给定的查询(例如“在2013年圣诞节之前传递的所有客户订单”),您需要一个表格,其中所有客户订单按日期排序(因此系统不必检查每一行的日期查看它是否匹配。它只需要数据的第一个“块”,直到您要查找的日期,然后返回它。

因此,您需要构建这些索引,它们将影响您可以运行的查询。默认情况下,每个属性都按降序排列。对于多个属性(或具有不同排序顺序)的任何查询,您需要具有由数据存储区构建的索引(在这种情况下,它们被称为composite indexes),因此您需要在{ {1}}。

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