前言
本文闡述一套經過生產環境驗證的千萬級資料全文檢索架構,僅節錄前幾章核心內容。
效能實測數據
- 環境:DELL PowerEdge 6850(四顆 64 位 Xeon MP 7110N / 8GB RAM)、RedHat AS4、MySQL 5.1.26、MyISAM、
key_buffer=1024M
- 單表 1000 萬筆(10 多欄位,含 int、datetime、varchar、text,僅主鍵無其他索引)
- 主鍵查詢
SELECT ... WHERE id = ... 耗時 0.01 秒
Sphinx 核心優勢
- 單一索引最大支援 1 億筆 記錄
- 1000 萬筆查詢速度 0.x 秒(毫秒級)
- 建立索引速度:100 萬筆約 3-4 分鐘,1000 萬筆約 50 分鐘,增量索引(10 萬筆)重建僅需幾十秒
- 支援分散式檢索、短語/統計排序、多種搜尋模式、任意文件欄位、MySQL 儲存引擎整合
架構設計思路
1. 呼叫方式極簡化
前端工程師只需一條 SQL 即可高效搜尋:
SELECT ... FROM myisam_table
JOIN sphinx_table ON (sphinx_table.sphinx_id = myisam_table.id)
WHERE query = '...';
2. 索引建立快、查詢快
Sphinx 由俄羅斯 Andrew Aksyonoff 開發,GPL/商業雙授權。特色:
- 索引建立速度達 10MB/秒(Lucene 為 1.8MB/秒)
- 2-4GB 文本搜尋平均 0.1 秒內回傳結果
- 最高實測 100GB 文本索引,單一索引 1 億筆
- 支援分散式檢索、複合排序、多搜尋模式、MySQL 儲存引擎整合
搭配 MyISAM 主鍵查詢每秒 10,000+ 次的特性,將 WHERE 條件交給 Sphinx 處理,MyISAM 僅做主鍵查詢,發揮雙方優勢。
3. 服務類型分離
為避免 MyISAM 讀寫鎖互斥導致寫入阻塞,將:
- 監聽 3306 連接埠的 MySQL 提供「搜尋查詢服務」
- 監聽 3406 連接埠的 MySQL 提供「索引來源服務」
4. 「主索引 + 增量索引」更新策略
- 前天 17:00 前的資料建立主索引,每天凌晨自動重建
- 前天 17:00 後至最新資料建立增量索引,每 3 分鐘自動重建
5. 「Ext3 + tmpfs」儲存優化
- 主索引放磁碟(Ext3)
- 增量索引放記憶體檔案系統
/dev/shm/,讀寫極快
- 開機腳本自動重建
/dev/shm/ 目錄結構與增量索引
6. 中文分詞詞庫
整合百度早期詞庫、搜狗細胞詞庫、LibMMSeg 高頻字庫等,暫不對外公開,可使用 LibMMSeg 內建詞庫。