← 一覧へ
データベース
#다차원색인#R-Tree#KD-Tree#Quad-Tree#공간DB#134회
最終更新 · 2026-09-30

多次元索引構造(Multidimensional Index Structure)

1. 概要

A. 定義

位置・空間・多属性のように2次元以上の多次元データを効率的に検索するための索引構造である。範囲質問(Range Query)、最近傍(NN, Nearest Neighbor)質問、空間包含・重複質問を高速に処理できるよう、空間そのものを階層的に分割・クラスタリングする。

多次元索引構造を一言で言えば「複数の軸の座標を同時に考慮して検索空間を狭めるデータ構造」である。従来の索引が値を大小順に一列に並べた辞書(Dictionary)であるとすれば、多次元索引は地図を区域に分けた地図帳(Atlas)に近い。「江南駅半径1km内のカフェ」を探すときにソウル全域のカフェを一つずつ比較せず、ただちに江南のページを開くように、多次元索引は質問領域と無関係な空間をまるごと枝刈り(Pruning)して探索コストを削減する。

このような構造が扱う質問は大きく三つである。第一は範囲質問で、「緯度37.4~37.5、経度127.0~127.1内のすべての地点」のように矩形(超直方体)領域に入る客体を探す。第二は最近傍質問で、与えられた一点から最も近いk個の客体を探す(kNN)。第三は空間関係質問で、二つの図形の包含・交差・隣接の可否を判定する。この三つの質問はいずれも「座標間の近接性」という共通の性質に依拠し、多次元索引はこの近接性を物理的な格納構造にそのまま反映する。

B. 登場背景および必要性

B-Treeのような従来の索引が多次元データに不適合である理由は根本的である。B-Treeは値を一つの軸(1次元)で全順序(Total Order)ソートし、大小比較で探索する。しかし「緯度・経度がともに特定範囲である地点を探す」のように複数の軸を同時に満たす必要のある質問には、全順序という前提そのものが成り立たない。(緯度がより大きい点が必ずしもより「近い」点ではない。)各軸に1次元索引を一つずつ張っても、一方の軸で候補を狭めた後、残りの軸は結局全数検査(Filtering)しなければならないため、選択度(Selectivity)が下がり性能の利得は微々たるものである。

空間データはそもそも「近い/含む」という関係が多次元座標の近接性で定義される。したがってこの近接性そのものを格納構造に反映し、空間を階層的に分割・クラスタリングする索引が必要である。ここに産業的需要が加わった。地図・ナビゲーションサービスが大衆化し、画像・音声を特徴ベクトル(Feature Vector)に変換して検索するマルチメディア検索が拡散し、決定的にLLMベースのRAG(検索拡張生成)と推薦システムが高次元埋め込みベクトル検索を必須インフラにした。今日、多次元索引は「地理空間」を越え「意味空間(Semantic Space)」まで扱う基盤技術へと拡張された。

2. 全体構造と種類

多次元索引は空間を分ける哲学によって、大きくデータ分割(Data Partitioning)方式と空間分割(Space Partitioning)方式に分かれる。前者は実際にデータのある場所を包んで束ねるため、データ分布に適応的であり(R-Tree系)、後者は空間そのものを規則的に割るため、実装が単純で空白空間も明示的に表現する(Quad-Tree・Grid File・KD-Tree)。下の概念図はこの分類体系を示す。

flowchart TB
  M["多次元索引構造"] --> DP["データ分割方式"]
  M --> SP["空間分割方式"]
  DP --> T1["R-Tree / R*-Tree (MBR階層)"]
  DP --> T2["SS-Tree / SR-Tree (球/球+MBR)"]
  SP --> S1["KD-Tree (軸交代の二分分割)"]
  SP --> S2["Quad-Tree / Oct-Tree (四分・八分割)"]
  SP --> S3["Grid File (多次元格子)"]
  M --> AP["近似方式 (高次元)"]
  AP --> A1["IVF (クラスタベース)"]
  AP --> A2["HNSW (グラフベース)"]
  style AP fill:#e8f0fe,stroke:#2f6fed,stroke-width:2px

A. R-Tree / R*-Tree — 空間DBの事実上の標準

R-TreeはB-Treeを多次元に一般化した平衡木で、各客体を包む最小境界矩形(MBR, Minimum Bounding Rectangle)を階層的に束ねて上がる。リーフノードは実際の客体のMBRを、上位ノードは下位MBRを再び包んだより大きなMBRを持つ。質問時には質問領域と重なるMBRを持つ枝のみをたどって降りるため、大部分の空間を一度に切り落とせる。

R-Treeの弱点は兄弟MBRが互いに重なる(Overlap)ことがある点である。重なりが大きいと一つの質問が複数の枝を同時にたどらねばならず、探索経路が膨らむ。これを改善したのがR*-Treeで、ノード挿入・分割時にMBRの面積(Area)だけでなく重なり(Overlap)と周長(Margin)まで最小化し、挿入失敗時には一部エントリを強制的に再挿入(Forced Reinsertion)して木の品質を高める。実測ベンチマークではR*-TreeはR-Tree比で範囲質問において相当な性能改善を示し、PostGIS・Oracle Spatialなど商用空間DBの既定索引として採択された。

面積・体積を持つ空間客体(建物外郭線、道路ポリライン、行政境界ポリゴン)と範囲質問に特に強い。例えばPostGISのGiST索引は内部でR-Tree系アルゴリズムを使い、「このポリゴンと交差する道路セグメント」を秒単位ではなくミリ秒単位で答える。

B. KD-Tree — 点データと NN 検索

KD-Tree(k-dimensional tree)は軸を交互に(x軸→y軸→…→x軸)しながら空間を二分分割する構造である。各内部ノードは一つの分割超平面(Hyperplane)を表し、その基準で点を左/右のサブツリーに分ける。点データの最近傍検索に効率的であるが、それは目標点から現在の最良距離を半径とする超球(Hypersphere)が反対側の部分空間と重ならなければ、その枝をまるごと枝刈りできるからである。

ただしKD-Treeは動的な挿入・削除時に平衡が容易に崩れ、次元が高くなると分割効果が急減する。数十次元を越えるだけでNN探索が事実上全数検査に収束する(後述の次元の呪い参照)。そのためKD-Treeは低次元(2~10次元)の点集合、たとえばロボティクスの位置推定や3Dポイントクラウド処理に主に使われる。

C. Quad-Tree / Grid File — 空間分割と格子

Quad-Treeは2次元空間を四つの象限に再帰分割する構造で、データのある領域のみをより細かく割るため、データが希薄・不均等な場合(空の海と密集した都心が共存する地図)に有利である。3次元に拡張したのがOct-Treeであり、ゲームエンジンの衝突検査やボクセル(Voxel)レンダリングに使われる。

Grid Fileは空間を多次元格子バケットに分け、各バケットをディスクページにマッピングする。データが均等分布するとき定数時間に近いアクセスを提供するが、分布が偏ると特定バケットのみ過密になり性能が崩れる弱点がある。

下の表は四種類の核心的な違いを整理したものである。ただしこれは補助手段にすぎず、実際の選択はデータ分布と主要な質問パターンをまず分析して決めねばならない。

種類 分割方式 強み 弱み・適合
R-Tree/R*-Tree MBR階層の束(データ分割) 領域客体・範囲質問、平衡木 MBR重なり時に低下、空間DB標準
KD-Tree 軸交代の二分分割 低次元の点NN検索 高次元で低下・動的不均衡
Quad-Tree 象限の再帰分割 希薄・不均等な2Dデータ 3DはOct-Tree、深さの偏差
Grid File 多次元格子バケット 均等分布で定数アクセス 偏った分布でバケット過密

3. 探索原理と選択基準

A. 範囲質問とNN質問の探索過程

多次元索引の探索は濾過(Filter)と精製(Refinement)という2段階で行われる。まず索引はMBR・格子のように近似した境界で候補を素早くふるい落とし(濾過段階)、その次に候補のみを実際の幾何演算(正確な距離・交差計算)で検証する(精製段階)。この2段階のおかげで高価な精密演算を少数の候補にのみ適用し、全体コストを削減する。

NN質問はここに分岐限定(Branch and Bound)技法を加える。現在までに見つけたk番目の最近傍距離を上限とし、あるノードの最小境界までの距離(MINDIST)がこの上限より大きければ、そのノード全体を訪問しない。優先度キューでMINDISTの小さいノードから訪問すれば不要なアクセスを大きく減らせる。下はR-Treeベースの範囲質問の処理フローである。

flowchart TB
  Q["質問領域の入力 (範囲/点+k)"] --> R["ルートノード訪問"]
  R --> C{"子MBRが質問領域と<br/>重なるか?"}
  C -->|"いいえ"| P["枝刈り (当該サブツリーを飛ばす)"]
  C -->|"はい"| D{"リーフノードか?"}
  D -->|"いいえ"| R2["当該の子へ下降"]
  R2 --> C
  D -->|"はい"| F["濾過: 候補客体のMBRを収集"]
  F --> RF["精製: 正確な幾何演算で検証"]
  RF --> RES["結果を返す"]
  P --> RES

B. 選択基準

どの構造が最適かはデータと質問の性格に依り、誤って選ぶと索引はかえって負担になる。データ種類が座標のみを持つ点であればKD-Treeが、面積・体積を持つ領域客体であればMBRベースのR-Treeが自然である。質問種類が範囲質問か、最近傍か、空間包含かによって有利な構造が分かれる。次元数が特に重要で、数十~数百次元を越えると後述の次元の呪いにより木の索引が無力化されるため、近似(ANN)へ方向を切り替えねばならない。データ分布が均等ならGrid Fileが、偏っていれば密度に適応する木構造がよい。

基準 考慮
データ種類 点(KD-Tree) vs 領域・客体(R-Tree)
質問種類 範囲・NN・空間包含のうち主なもの
次元数 低次元の木 vs 高次元の近似(ANN)
分布 均等(Grid File) vs 偏り(木系)
動的性 挿入・削除の頻度(R*-Treeは動的に強い)

4. 活用事例

多次元索引は「近いものを素早く探す」あらゆるサービスの土台にある。空間DB・GISでは「私の周辺1kmの食堂」や「この行政区域に含まれる建物」をR-Treeで即座に探す。KakaoMap・TMAPのような国内サービスの周辺検索、配達アプリの「近い店」の並べ替えが代表的で、内部ではPostGISやElasticsearchのgeo_point索引(BKD-Tree、KD-Treeのディスク変形)を使う。Elasticsearch・Luceneは実際に数値・地理フィールドにBKD-Treeを適用して大容量の範囲質問を加速する。

マルチメディア検索では画像を特徴ベクトルに変換した後、類似画像をNNで探し、OLAPでは多次元キューブの範囲集計を加速する。しかし今日最大の応用はAIベクトル検索である。OpenAIのtext-embedding-3や国内の埋め込みモデルはテキストを通常768~3072次元のベクトルに変換するが、このような超高次元では前述の木構造が無力化される。そのためPinecone・Milvus・pgvector・FAISSのようなベクトルDBは木の代わりにHNSW・IVFのような近似最近傍(ANN)アルゴリズムを採択する。これがRAG・意味検索・推薦システムの核心エンジンである。

分野 活用 代表技術
空間DB・GIS 周辺検索・領域質問(位置サービス) PostGIS(GiST/R-Tree)、BKD-Tree
マルチメディア 画像・特徴ベクトルの類似度(NN)検索 KD-Tree、Product Quantization
OLAP 多次元キューブの範囲集計 Grid File、R-Tree
AIベクトル検索 高次元埋め込みの近似最近傍(ANN) HNSW、IVF-PQ (FAISS・Milvus)

5. 深化 — 次元の呪いとベクトル検索への進化

多次元索引を理解する核心の鍵は次元の呪い(Curse of Dimensionality)である。次元dが大きくなるほどデータの置かれた超空間の体積が指数的に膨張し、有限のデータ点どうしがますます遠ざかりすべての点間距離が似通う。最近傍と最遠傍の距離比が1に収束すると「近い」という概念そのものが曖昧になり、質問超球がほとんどすべてのノードと重なって木の枝刈り効果が消える。実験的におよそ10~20次元を越えるとKD-Tree・R-Treeの性能が線形スキャン水準に落ちる。

この壁を越えるための方向は二筋である。一つは次元縮小で、PCA・オートエンコーダで本質的次元(Intrinsic Dimension)のみを残した後に索引する。もう一つは正確度を少し諦めて速度を得る近似最近傍(ANN)である。代表的にIVF(Inverted File)はベクトルをk-meansでクラスタリングした後、質問に近い少数クラスタのみを探索し、ここにPQ(Product Quantization)を結合(IVF-PQ)してベクトルを圧縮格納する。HNSW(Hierarchical Navigable Small World)は階層的グラフで隣接をたどって貪欲に移動し、対数時間に近い検索を提供して、現在のベクトルDBの事実上の標準になった。すなわち従来の木ベースの多次元索引は低次元の空間データを、グラフ・クラスタベースのANNは高次元の意味ベクトルを担う役割分担が定着した。

もう一つ注目すべき流れは関係型DBへの統合である。PostgreSQLのpgvector拡張は2024~2025年を経てHNSW索引を正式支援し、別途のベクトルDBなしにSQLの中で埋め込み検索を行えるようになった。多次元索引が特殊システムの専有物から汎用DBMSの基本機能へと吸収される過程と見ることができる。

6. 考慮事項および示唆点 (技術士の観点)

  1. 索引はただではない — 格納・更新コストのトレードオフ。多次元索引は照会を加速するが挿入・削除・更新時に木の再構成・再挿入コストがかかる。書き込みが頻繁で照会パターンが単純ならば索引はかえって総コストを増やしうるため、ワークロードの読み/書き比率をまず分析せねばならない。
  2. 次元と分布による構造選択が性能を左右する。同一データも構造選択によって数十倍の性能差が出る。低次元・領域客体はR*-Tree、低次元・点はKD-Tree、均等分布はGrid File、高次元埋め込みはHNSW/IVFへマッピングする設計原則を立てねばならない。
  3. 高次元では「正確」より「十分に正確+速い」が実用的である。RAG・推薦のように遅延時間(latency)がユーザー体験を左右するサービスでは、再現率(Recall)95~99%水準のANNが100%正確な完全探索より圧倒的に有利である。RecallとQPS(秒当たり質問)のトレードオフをパラメータ(ef_search、nprobe)で調律することが実務力量である。
  4. ハイブリッド検索とフィルタリングの結合が要である。実務ではベクトル類似度だけでなくメタデータフィルタ(価格・カテゴリ・期間)とキーワード(BM25)を共に張らねばならない。事前フィルタリング・事後フィルタリングの正確度-性能均衡、そして空間索引とベクトル索引の結合設計が次世代検索アーキテクチャの核心課題である。
  5. 関係型DBへの統合の流れを戦略的に活用する。pgvectorのように既存DBMSに索引が吸収される趨勢を考えれば、小・中規模サービスは別途のベクトルDB導入の運用負担を負うより、既存スタックの中で多次元索引を活用する方が総所有コスト(TCO)の面で合理的でありうる。

参考資料


一言まとめ: 多次元索引構造は R-Tree・KD-Tree・Quad-Tree・Grid File などで空間を階層分割し、多次元データの範囲・NN質問を濾過・精製の2段階で加速するものであり、データ・質問種類と次元数・分布に合わせて選択するが、次元の呪いのために高次元ではHNSW・IVFのようなベクトル検索(ANN)へ進化し、RAG・推薦の核心インフラになった。