94
Google App Engine: Datastore のクエリを 理解しよう @bufferings 2010/07/31 appengine ja night #9

Google App Engine: Datastore のクエリを 理解しよう

Embed Size (px)

DESCRIPTION

2010-07-31に開催された appengine ja night 9で 発表した資料です。 GAEのDatastoreのクエリについて。

Citation preview

Page 1: Google App Engine: Datastore のクエリを 理解しよう

Google App Engine:Datastore のクエリを理解しよう

@bufferings2010/07/31

appengine ja night #9

Page 2: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #92

自己紹介@bufferings

● #appengine ja night in kansaihttp://www.ustream.tv/channel/ajnk

● Slim3 サイトの日本語化http://sites.google.com/site/slim3documentja/

● Kotori Web JUnit Runner(ktrwjr ことーじゃ )http://code.google.com/p/ktrwjr/

Page 3: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #93

クエリの前に

Page 4: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #94

Datastore

Page 5: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #95

Bigtable

Page 6: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #96

Bigtable

Row name Row dataA distributed, shareded, sorted Array

Page 7: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #97

Entity

Page 8: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #98

Entity

Page 9: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #99

Entities Table

Page 10: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #910

Entities TablePath

Page 11: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #911

Entities Table > 例

※ この図は概念図です。実際の実装を表すものではありません。

Page 12: Google App Engine: Datastore のクエリを 理解しよう

#appengine ja night in kansai 2 ( #ajnk2 )12

ソフトスキーマ

Page 13: Google App Engine: Datastore のクエリを 理解しよう

#appengine ja night in kansai 2 ( #ajnk2 )13

Null 値と Missing

Page 14: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #914

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 15: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #915

Read

Page 16: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #916

Prefix Scan

Page 17: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #917

Range Scan

Page 18: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #918

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 19: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #919

Get

Page 20: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #920

Get● Key = MyApp/Person(1)/Person(10)

Page 21: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #921

(参考) Batch Get

Page 22: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #922

Query

Page 23: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #923

Query

Page 24: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #924

Query

Page 25: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #925

Index● 使用する全ての Query に対して Index が必要● 問い合わせ時の計算・集約・ Join はできない● プロパティの一部を返すことはできない

( キーだけを返すことは可能 )● Entity を更新したら関係する Index が更新される

Page 26: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #926

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 27: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #927

Query の構成● Kind を指定● 0 個以上のフィルタを指定

=, <=, <, >, >=, !=, IN● 0 個以上のソート順を指定

ASC, DESC

※Kind を指定しない Kindless Query という特別な種類の Query もあります

Page 28: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #928

Query と Kind● Query は単一の Kind の Entity だけを取得

→これが Kind の主な目的

Page 29: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #929

制約● あるプロパティをフィルタまたはソートするには、そ

のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ

ティに限られる● 不等式フィルタで使用されているプロパティは他の

ソート順よりも先にソートする必要がある

Page 30: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #930

制約● あるプロパティをフィルタまたはソートするには、そ

のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ

ティに限られる● 不等式フィルタで使用されているプロパティは他の

ソート順よりも先にソートする必要がある

Query の仕組みを知ることで制約の理由がわかります。

→ 今日の目標

Page 31: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #931

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 32: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #932

Index Tables● 自動で作成される Index

● Kind Index● Single Property Index

● 定義が必要な Index● Custom Index

Page 33: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #933

Kind Index

Page 34: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #934

Kind Index● 特定の Kind の全 Entity を取得

Page 35: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #935

Kind Index● 特定の Kind の全 Entity を取得

● [Kind] Food

Page 36: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #936

Single Property Index● ASC

Page 37: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #937

Single Property Index● DESC

Page 38: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #938

Single Property Index● 1 つのプロパティに対する Filter● 1 つのプロパティに対する Sort● 1 つのプロパティに対する Filter と Sort

Page 39: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #939

Single Property Index● 1 つのプロパティに対する Filter

● [Filter] name = "Suzuki"

Page 40: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #940

Single Property Index● 1 つのプロパティに対する Filter

● [Filter] name > "B" and name < "T"

Page 41: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #941

Single Property Index● 1 つのプロパティに対する Sort

● [Sort] name DESC

Page 42: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #942

Single Property Index● 1 つのプロパティに対する Filter と Sort

● [Filter] name > "B" and name < "T"● [Sort] name ASC

Page 43: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #943

Custom Index

Page 44: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #944

Custom Index● 2 つ以上のプロパティに対する Sort● 2 つ以上のプロパティに対する Filter● Ancestor と Filter または Sort● Key の降順ソート

※ Merge Join (後述)で可能な Query もあります。

Page 45: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #945

Custom Index● Custom Index の定義

Page 46: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #946

Custom Index● 2 つ以上のプロパティに対する Sort● [Sort] height ASC, weight DESC

Page 47: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #947

Custom Index● 2 つ以上のプロパティに対する Filter● [Filter] lastname = "Suzuki" and

firstname = "Jiro"

Page 48: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #948

Custom Index● 2 つ以上のプロパティに対する Filter

● [Filter] lastname = "Suzuki" and firstname >= "B" and firstname < "T"

Page 49: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #949

Custom Index● 2 つ以上のプロパティに対する Filter

● [Filter] height >= 170● [Sort] height ASC, weight DESC

Page 50: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #950

Custom Index● 不等式フィルタ使用時の 3 つのルール● その1

1 つの不等式フィルタと複数の等式フィルタがある場合は、まず等式フィルタのプロパティでソートされ、次に不等式フィルタのプロパティでソートされなければならない

Page 51: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #951

Custom Index● [Filter] height >= 165 and weight = 70● [Sort] height ASC, weight DESC

Page 52: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #952

Custom Index● 不等式フィルタ使用時の 3 つのルール● その 2

1 つの不等式フィルタと複数のソート順がある場合は、まず不等式フィルタのプロパティでソートされ、次にその他のプロパティでソートされなければならない

Page 53: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #953

Custom Index● [Filter] weight > 60● [Sort] height ASC, weight DESC

Page 54: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #954

Custom Index● 不等式フィルタ使用時の 3 つのルール● その 3

不等式フィルタは1つのプロパティにしか適用できない

Page 55: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #955

Custom Index● [Filter] height >= 170 and weight >= 70

Page 56: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #956

Custom Index● [Filter] height >= 170 and weight >= 70

Page 57: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #957

Custom Index● Ancestor と Filter または Sort

● Ancestor Query は今日は説明しません

Page 58: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #958

Custom Index● Key の降順 Sort には Custom Index が必要

Page 59: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #959

ここまでのまとめ● 自動で作成される Index

● Kind Index– 特定の Kind の全 Entity を取得

● Single Property Index– 1 つのプロパティに対する Filter– 1 つのプロパティに対する Sort– 1 つのプロパティに対する Filter と Sort

Page 60: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #960

ここまでのまとめ● 定義が必要な Index

● Custom Index– 2 つ以上のプロパティに対する Sort– 2 つ以上のプロパティに対する Filter– Ancestor と Filter または Sort– キーの降順 Sort

Page 61: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #961

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 62: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #962

Merge Join● 複数のプロパティに対して等式フィルタのみを適用

する場合は、 Custom Index を使用せずに Queryを実行することができる

● 条件● [Filter] 等式フィルタのみ● [Sort] なし

Page 63: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #963

Merge Join● 複数の Single Property Index をマージしながら検

索⇒ "Merge Join"● Key がソートされていることを利用して "zig-zag" ア

ルゴリズムを使用

Page 64: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #964

Merge Join● [Filter] a=1 and b=2 and c=3

Page 65: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #965

Merge Join● [Filter] a=1 and b=2 and c=3

Page 66: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #966

Merge Join● [Filter] a=1 and b=2 and c=3

Page 67: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #967

Merge Join● [Filter] a=1 and b=2 and c=3

Page 68: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #968

Merge Join● [Filter] a=1 and b=2 and c=3

Page 69: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #969

Merge Join● [Filter] a=1 and b=2 and c=3

Page 70: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #970

Merge Join● [Filter] a=1 and b=2 and c=3

Page 71: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #971

Merge Join● [Filter] a=1 and b=2 and c=3

Page 72: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #972

Merge Join● [Filter] a=1 and b=2 and c=3

Page 73: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #973

Merge Join● [Filter] a=1 and b=2 and c=3

Page 74: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #974

Merge Join● データ量が増えてくると Merge Join では処理しき

れなくなる⇒「 Custom Index が必要」というエラーになる

● Custom Index が定義されている場合は Merge Join せずに Custom Index が使用される

Page 75: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #975

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 76: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #976

制約● あるプロパティをフィルタまたはソートするには、そ

のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ

ティに限られる● 不等式フィルタで使用されているプロパティは他の

ソート順よりも先にソートする必要がある

Page 77: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #977

Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP

Page 78: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #978

MVP と等式フィルタ● Entity1(Key1)

● favorite=["apple", "google"]● Entity2(Key2)

● favorite=["google"]● Entity3(Key3)

● favorite=["orange"]

Page 79: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #979

MVP と等式フィルタ

Page 80: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #980

MVP と等式フィルタ● [Filter] favorite="google"

Page 81: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #981

MVP と等式フィルタ● リスト内のいずれかの値が等式フィルタに一致す

れば取得される

Page 82: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #982

MVP と等式フィルタ● [Filter] favorite="google" and favorite="apple"● Merge Join によって Entity1 が取得される

Page 83: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #983

MVP と不等式フィルタ● Entity1(Key1)

● val=[1, 3, 5]● Entity2(Key2)

● val=[2, 3, 4]

Page 84: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #984

MVP と不等式フィルタ● Entity1(Key1)

● val=[1, 3, 5]● Entity2(Key2)

● val=[2, 3, 4]

Page 85: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #985

MVP と不等式フィルタ● [Filter] val >= 3● 最初にマッチしたものが採用される

Page 86: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #986

MVP とソート順● Entity1(Key1)

● val=[1, 3, 5]● Entity2(Key2)

● val=[2, 3, 4]

Page 87: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #987

MVP とソート順

Page 88: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #988

MVP とソート順● ASC でも DESC でも Entity1,Entity2 の順になる

Page 89: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #989

インデックス爆発● MVP に対するフィルタを複数持つ Custom Index を

作成した場合● Entity1

● val1: 要素数 10● val2: 要素数 10

● Custom Index● [Sort] val1 ASC, val2 ASC⇒Entity1 の Index は 100 行になる

Page 90: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #990

インデックス爆発● 1Entity に対するインデックス数は 5000 まで● Entity2

● val1: 要素数 18● val2: 要素数 18● val3: 要素数 18

● Query● [Filter] val1=x and val2=y and val3=z

⇒ インデックス爆発

Page 91: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #991

インデックス爆発● Ancestor Query の Custom Index

● Ancestor は展開される● 深い EG を形成している場合に MVP との組み合

わせでインデックス爆発になりやすい

Page 92: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #992

Next gen queries● Merge Join と Multi Query(Custom Index を使用す

るもの ) の実装がパワーアップするらしいhttp://code.google.com/events/io/2010/sessions/next-gen-queries-appengine.html

Page 93: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #993

参考● Programming Google App Engine

http://www.amazon.co.jp/o/ASIN/059652272X● Under the Covers of the Google App Engine Datastore

http://sites.google.com/site/io/under-the-covers-of-the-google-app-engine-datastoreスライドはhttp://snarfed.org/space/datastore_talk.html

● @kazunori_279 さんの「 GAE/J ってどう使う?」http://d.hatena.ne.jp/kazunori_279/20090617/1245224939

● @ashigeru さんの「レンジスキャンのアレ」http://gist.github.com/294650

● Cacoo (カクー )http://cacoo.com/

Page 94: Google App Engine: Datastore のクエリを 理解しよう

appengine ja night #994

ありがとうございました