| システム | インデックス |
|---|---|
| PostgreSQL 17 + PostGIS | R-tree (GIST) |
| MySQL 8.0 Spatial | R-tree (SPATIAL) |
| Redis 8 Geospatial | Sorted Set + Geohash |
| MongoDB 8.0 | 2dsphere |
| Elasticsearch 9.x | BKD-tree (Lucene) |
| Pure Python (NumPy) | なし(全件スキャン・ベースライン) |
/opt/geo_benchmark/
├── 00_setup_all.sh ← 全ソフトウェア一括インストール
├── raw/ ← 入力データ置き場
│ ├── stationxxxx.csv
│ └── japan-xxxxxx.osm.pbf
├── scripts/
│ ├── 01_tuning_apply.sh ← チューニング適用
│ ├── 01_tuning_remove.sh ← チューニング削除
│ ├── 02_data_prepare.py ← データ整形
│ ├── 03_db_setup.py ← DB設計・インポート(全DB起動中に実行)
│ ├── 04_benchmark.py ← パフォーマンス測定(bench_*.shから呼ばれる)
│ ├── 05_report.py ← CSV/Markdownレポート生成
│ ├── bench_pg.sh ← PostgreSQL 単独計測
│ ├── bench_mysql.sh ← MySQL 単独計測
│ ├── bench_redis.sh ← Redis 単独計測
│ ├── bench_mongo.sh ← MongoDB 単独計測
│ ├── bench_es.sh ← Elasticsearch 単独計測
│ └── bench_python.sh ← Pure Python 単独計測
├── sql/
│ └── query_reference.sql ← 手動確認・EXPLAIN用クエリ集
├── data/ ← 整形済みデータ(自動生成)
├── results/ ← 測定結果JSON(各bench_*.shが追記)
└── report/ ← レポート(05_report.pyが生成)
| システム | 設定項目 | 値 | 根拠 |
|---|---|---|---|
| MySQL | innodb_buffer_pool_size | 5GB | 物理メモリの約70%(推奨50〜80%) |
| PostgreSQL | shared_buffers | 2GB | 物理メモリの約25%(PGの推奨上限) |
| PostgreSQL | effective_cache_size | 5GB | OS含むキャッシュ全体の見積もり |
| PostgreSQL | work_mem | 64MB | 接続数が少ないので増やせる |
| Redis | maxmemory | 5GB | データサイズに対して余裕のある上限 |
| MongoDB | wiredTiger cacheSizeGB | 3GB | 物理メモリの約40〜50% |
| Elasticsearch | Xmx / Xms | 3GB | ヒープはRAMの50%以下・32GB未満推奨 |
chmod +x /opt/geo_benchmark/00_setup_all.sh
sudo /opt/geo_benchmark/00_setup_all.sh 2>&1 | tee /opt/geo_benchmark/setup.log所要時間: 15〜25分
インストール後、全サービスは停止状態になります。
# 駅データ.jp 無料版CSVを配置
cp /path/to/station20xxxxfree.csv /opt/geo_benchmark/raw/
# Geofabrik 日本データ(PBF形式)を配置
# https://download.geofabrik.de/asia/japan.html
cp /path/to/japan-latest.osm.pbf /opt/geo_benchmark/raw/source /opt/geo_benchmark/venv/bin/activate
cd /opt/geo_benchmark/scripts
python 02_data_prepare.py \
--station /opt/geo_benchmark/raw/station20xxxxfree.csv \
--pbf /opt/geo_benchmark/raw/japan-latest.osm.pbf \
--outdir /opt/geo_benchmark/data所要時間: 5〜15分(PBF解析中心)
# 全サービスを起動
sudo systemctl start postgresql-17 mysqld redis mongod elasticsearch
# Elasticsearchの起動を待つ(greenになるまで)
watch -n5 'curl -sf http://localhost:9200/_cluster/health | python3 -m json.tool'
# 全DBに一括インポート
python 03_db_setup.py --all所要時間: 5〜20分
インポート完了後、全サービスを停止しておきます:
sudo systemctl stop postgresql-17 mysqld redis mongod elasticsearch各スクリプトは [計測回数] [結果ディレクトリ] の2引数を受け取ります。
チューニングなし・ありで結果ディレクトリを分けることで、両方の結果を保持できます。
OUTDIR=/opt/geo_benchmark/results/no_tuning
bash bench_pg.sh 100 ${OUTDIR}
bash bench_mysql.sh 100 ${OUTDIR}
bash bench_redis.sh 100 ${OUTDIR}
bash bench_mongo.sh 100 ${OUTDIR}
bash bench_es.sh 100 ${OUTDIR}
bash bench_python.sh 100 ${OUTDIR}# チューニング適用
sudo bash /opt/geo_benchmark/scripts/01_tuning_apply.sh
OUTDIR=/opt/geo_benchmark/results/tuned
bash bench_pg.sh 100 ${OUTDIR}
bash bench_mysql.sh 100 ${OUTDIR}
bash bench_redis.sh 100 ${OUTDIR}
bash bench_mongo.sh 100 ${OUTDIR}
bash bench_es.sh 100 ${OUTDIR}
bash bench_python.sh 100 ${OUTDIR}各スクリプトは results/{no_tuning,tuned}/summary_all.json に追記していくので、
途中で止めても再実行すれば続きから進められます。
チューニングなし・ありそれぞれのディレクトリに対してレポートを生成します。
source /opt/geo_benchmark/venv/bin/activate
cd /opt/geo_benchmark/scripts
# チューニングなし
python 05_report.py \
--indir /opt/geo_benchmark/results/no_tuning \
--outdir /opt/geo_benchmark/report/no_tuning
# チューニングあり
python 05_report.py \
--indir /opt/geo_benchmark/results/tuned \
--outdir /opt/geo_benchmark/report/tuned出力:
report/
├── no_tuning/
│ ├── benchmark_results.csv ← 全条件の集計(Excel加工用)
│ └── benchmark_report.md ← Markdownレポート
└── tuned/
├── benchmark_results.csv
└── benchmark_report.md
Rocky Linux 9 では crb(CodeReady Builder)リポジトリを有効化する必要があります。
dnf install -y 'dnf-command(config-manager)'
dnf config-manager --set-enabled crb
dnf makecache
dnf install -y postgresql17-server postgresql17 postgis35_17Rocky Linux 9 では /usr/share/keyrings/ がデフォルトで存在しないため、手動で作成します。
mkdir -p /usr/share/keyrings
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgRocky Linux 9 + PostgreSQL 17 のデフォルト認証が peer または scram-sha-256 のままの場合。
# pg_hba.conf の認証方式を md5 に変更
sudo sed -i 's/^local\s\+all\s\+all\s\+peer$/local all all md5/' \
/var/lib/pgsql/17/data/pg_hba.conf
# 確認
grep -E "^local|^host" /var/lib/pgsql/17/data/pg_hba.conf
# 反映
sudo systemctl restart postgresql-17psql のパスワード入力を省略するには .pgpass を設定します。
echo "localhost:5432:geo_benchmark:bench_user:bench1234" > ~/.pgpass
chmod 600 ~/.pgpassbench_pg.sh のヘルスチェックが sudo -u postgres psql を呼んでいる場合。
pg_isready を使う方式に修正します。
sed -i 's/sudo -u postgres psql -c "SELECT 1"/\/usr\/pgsql-17\/bin\/pg_isready -U bench_user -d geo_benchmark -q/' \
/opt/geo_benchmark/scripts/bench_pg.shMySQL の ST_GeomFromText は SRID 4326(地理座標系)において POINT(緯度 経度) の順を要求します(他システムと逆)。03_db_setup.py の MySQL セクションで POINT({r['lat']} {r['lon']}) になっているか確認してください。
sudo journalctl -u elasticsearch --no-pager | tail -50
# vm.max_map_count の確認(262144以上が必要)
sysctl vm.max_map_count
sudo sysctl -w vm.max_map_count=262144全DBが起動している状態で実行する必要があります。
sudo systemctl start postgresql-17 mysqld redis mongod elasticsearch
# Elasticsearch の起動を待つ
sleep 60
curl -s http://localhost:9200/_cluster/health | python3 -m json.tool
python /opt/geo_benchmark/scripts/03_db_setup.py --allsudo bash /opt/geo_benchmark/scripts/bench_pg.sh駅データ.jp 無料版は路線ごとにレコードが存在するため、複数路線が乗り入れる駅は同じ地点に複数のレコードがあります。例えば「さいたま新都心」はJR各線で3件カウントされます。そのため東京30km圏のヒット数が多く見えることがありますが、これはデータの仕様によるものです。全システムで同じデータを使うため、システム間の比較には影響しません。
また路面電車の停留所も含まれるため、広島・大阪・京都などでは周辺の件数が多くなります。