Neo4j のパフォーマンスに関する内部実装の理解と、それを踏まえた上でパフォーマンスを向上させるための工夫について書かれた記事が Graphable より公開されました。
ハイレベルな内容に留まりながら非常に明快な説明をしている良い記事ですので、本ブログでも紹介することにしました。
本記事を読むと、Graph Native なグラフデータベースとはどういう意味なのか、Neo4j の 3 種類のインデックスタイプがどう機能しているのか、どのようにディスクとメモリが活用されているのかについて概要を理解することができます。
同じく Index-Free Adjacency につても紹介されています。こちらは、本ブログのこちらの記事 でも別の切り口から説明しています。
6 Tuning Tips
また、本記事で紹介されている以下 6 つの工夫については、基本的なものも含みますが、ぜひ頭に入れておくと良いでしょう。
EXPLAIN/PROFILE
を利用したクエリの実行計画の分析- RDBMS でも当たり前に行われるパフォーマンスチューニングの一つ
- Neo4j 4.3 で導入された Token Lookup Indexes の利用
- デフォルトで作成されているため、消さずにそのままの利用を推奨
NFS/NAS
ではなくEXT4/XFS
のファイルシステムの利用- 大量の Disk I/O の発生が前提であるため、ネットワーク上をやり取りするファイルシステムは避けるべき
- Disk Contention を防ぐため、データ自体とトランザクションログの保存先を分ける
- データ自体は
dbms.directories.data
、トランザクションログはdbms.directories.transaction.logs.root
で設定変更可能。詳細はドキュメントを参考のこと
- データ自体は
- Neo4j は Java アプリケーションなので、JVM のチューニングも行う
neo4j.conf
のdbms.memory.heap.{initiali_size,max_size}
で変更可能
- ディスク上のデータをキャッシュするためにメモリも多用するため、正しい想定メモリ利用量を計算する
Total Physical Memory = Heap + Page Cache + OS Memory