導入
クエリが思ったより遅いとき、「実際にどう実行されているか」を確認できると、原因の見当がつけやすくなります。Neo4jには、そのための2つのキーワードが用意されています。
説明
クエリの先頭に EXPLAIN をつけると、そのクエリを実際には実行せず、Neo4jがどのような手順(実行計画)で処理するつもりかだけを表示してくれます。
EXPLAIN
MATCH (p:Person {name: 'Alice'})-[:ACTED_IN]->(m:Movie)
RETURN m.title
PROFILE をつけると、クエリを実際に実行したうえで、各処理ステップで何件のデータに触れたか(実測値)まで表示してくれます。
PROFILE
MATCH (p:Person {name: 'Alice'})-[:ACTED_IN]->(m:Movie)
RETURN m.title
flowchart LR
E["EXPLAIN<br/>実行計画だけ見る<br/>(実行はしない)"]
P["PROFILE<br/>実際に実行して<br/>実測件数も見る"]
実行計画を見るときにまず注目したいのが、ノードを探す最初のステップです。第7章で学んだインデックスが効いていれば「NodeIndexSeek」のような、狙ったノードだけを直接見つける処理が表示されます。逆にインデックスが効いておらず、:Person ラベルを持つすべてのノードを1つずつ調べる「NodeByLabelScan」のような処理になっていると、データが増えたときに遅くなる原因になります。
クエリが遅いと感じたときの基本的な調べ方は、次の手順です。
PROFILEをつけて実行し、どのステップで処理件数が多くなっているかを確認する。- 件数が多いステップの手前で、絞り込み条件(
WHEREやパターンの条件)をもっと早い段階にかけられないか検討する。 - よく検索に使うプロパティに、第7章で学んだインデックスが張られているか確認する。
EXPLAIN と PROFILE は、Cypherを書くときの「デバッガ」のような存在です。慣れてきたら、複雑なクエリを書いた後は一度 PROFILE で覗いてみる習慣をつけると、パフォーマンスの勘所が身についていきます。