← 事例一覧へ
導入事例 · 不動産 / 業務SaaS

20秒の検索を、7ミリ秒に。

約18万8千件の部屋データを抱える不動産物件管理SaaSが、「検索に20秒かかる」「ログインしただけで8秒待つ」という状態でした。COCONはシステムを根本から診断し、FULLTEXT ngram検索・複合インデックス・クエリ設計の是正によって体感速度を劇的に改善。mTLSクライアント証明書によるアクセス制御を維持しながら、staging環境を整備してリグレッションを防ぐ体制も構築しました。

https://prolis.jp — 本番稼働中(mTLSクライアント証明書必須)
約2,700倍
フリーワード検索(20.8秒→7ms)
188,000
室の実データで検証
0.37秒
ログイン後ダッシュボード(7.8秒→)
4
PLパフォーマンスチケットを一括完了
課題 · THE CHALLENGE

朝、システムを開いて20秒待つのは、仕事じゃない。

不動産管理の現場では、担当者が朝イチにシステムを開き、その日の対応物件を素早く確認するところから仕事が始まります。ところがProlis(prolis.jp)は、ログイン直後のダッシュボード表示に7.8秒、フリーワード検索に最大20秒以上かかっていました。対象は174,000〜188,000件の部屋データ——規模のある本番データです。現場スタッフは毎日このストレスと戦いながら業務をこなしていました。

全表スキャンのフリーワード検索

LIKE '%word%' の全表スキャンで実装され、先頭ワイルドカードでインデックスが効かない状態(最大20.8秒)。

肥大化したsearch_note

search_noteカラムは平均874文字・合計145MBのblobデータ。

ログイン直後の7.8秒

ダッシュボードのステータス集計クエリ(deleted_at IS NULLでのGROUP BY)を全表スキャンで実行し、7.8秒。

一覧画面の遅延

所有者一覧のwhereHas('building_rooms')が相関EXISTSを生成し19.8秒。リマインダー一覧フィルタで8.4秒。

mTLSによる計測の壁

mTLSクライアント証明書が必要なため外部ツールからの直接アクセスが不可。内部計測で検証する必要がある。

staging環境の不在

staging環境がなく、本番への変更が直接適用されるリスクを抱えていた。

解決 · WHAT COCON BUILT

計測して、直す。高速化と安全性を同時に。

COCONは以下の柱で高速化と安全性を同時に実現しました。

01
PL-35 — メモを検索対象に

building_room_memosをsearch_noteに取り込むバックフィル(18万4千件)を実行し、検索ヒット漏れを根絶。「テレコール」「付箋」「金額次第」も検索ヒット可能に。

02
PL-36 — FULLTEXT ngram検索

search_noteにFULLTEXT ngramインデックスを適用し、ModelHelper::freeWordSearch()を新設。全角スペース正規化・BOOLEAN MODE演算子除去・2文字以上MATCH/1文字LIKEフォールバックを実装。単語検索20.8秒→7ms(約2,700倍)、2語検索13.2秒→1.9秒(約7倍)。

03
PL-38 — ダッシュボード最適化

(deleted_at, status_type_id) 複合インデックスの追加で、ログイン後のダッシュボード集計を7.8秒→0.37秒(21倍)に短縮。

04
PL-38 — 一覧クエリ最適化

(is_reminder, deleted_at) インデックスでリマインダー8.4秒→1.8ms。(owner_id, deleted_at) インデックス+ANALYZE TABLEで所有者一覧19.8秒→0.5秒(40倍)。

05
staging環境整備

staging→main→prodの3段ワークフローを導入。本番デプロイ前にstaging.prolis.jpでの動作確認を必須化。

06
mTLSセキュリティ維持

prolis.jpへのアクセスはmTLSクライアント証明書が必須のまま。顧客データ保護の核心を変更せずに、全最適化を完遂。

実現の裏側 · WHAT IT TOOK
本番同等データでの計測

staging環境に174,000〜188,000件の本番相当データを用意し、アプリケーションコード経由(php artisan tinker)で実計測。mTLSのためcurlでは計測不能な制約を内部経路で回避した。

インデックス列順のこだわり

(status_type_id, deleted_at)の逆順ではオプティマイザがUsing temporaryを選択。(deleted_at, status_type_id)に変更してはじめてcovering indexが効いた——1本目のPRで失敗し、2本目で修正するという実証を経た。

FULLTEXT ngram副作用の対処

innodb_ft_total_cache_sizeのデフォルト(610MB)がVPS RAM(1.7GB)を圧迫し、本番でMySQLがOOMクラッシュ。64MBに絞りswappinessを調整して当日復旧。小RAMサーバーへのFULLTEXT適用時の必須知識として記録した。

URLの暗号化ID

building_encrypt_id / building_room_encrypt_idなど、URLに生の連番を露出しないテナント保護設計を全ルートで維持した。

スクリーンショット · SCREENSHOTS

実物で、お見せします。

Prolis 物件管理ダッシュボード — 物件検索と集計
物件管理ダッシュボード — 物件18万室規模(検証環境)
Prolis 物件一覧 — 3,316棟の一覧表示
物件一覧 — 3,316棟・184,640件のリストデータ(検証環境)
成果 · THE RESULTS

20秒が7ミリ秒に。現場の体感から変える。

検索・業務スピード フリーワード検索20秒・ログイン7.8秒 → 検索7ms・ログイン0.37秒に爆速化
導入前 8% 導入後 95%+
約2,700倍
フリーワード検索速度改善(20.8秒→7ms)
21倍
ダッシュボード集計(7.8秒→0.37秒)
40倍
所有者一覧(19.8秒→0.5秒)
188,000
室の実データで検証

prolis.jpで本番稼働中(mTLSクライアント証明書必須)。PL-35/36/37/38はすべて本番VPSに適用済みで、フリーワード検索「金額次第」は本番データで237件の即時ヒットを確認済み。本番migrate前には毎回mysqldump --single-transactionバックアップを作成し、Rollback可能な状態を維持しています。

※ 達成度イメージ(導入前 8% → 導入後 95%+)は、自社評価による代表値です。検索・ダッシュボード・一覧の処理速度(約2,700倍・21倍・40倍)は本番環境・本番相当データでの実測値です。

← 前の事例 Kokorozashi 事例一覧 次の事例 → StudyLap

この事例に近い課題をお持ちですか?

まずは、いま向き合っている課題をお聞かせください。実装まで責任を持って伴走します。

課題をお聞かせください