MySQL、Sphinx 等傳統搜尋引擎查詢為單線程。32 核 16 盤服務器跑單查詢,僅用 1 核 1 盤,CPU 利用率 ~3%,I/O 利用率 ~6%。
利用 Sphinx 內建分散式搜尋架構,將單一索引拆分為多個本地分片,配置 dist_threads 並行查詢,最終合併結果。
graph TD
Client -->|查詢請求| Searchd[searchd 分散式索引 idx1]
Searchd -->|並行分發| Local1[idx1p0 分片 0]
Searchd -->|並行分發| Local2[idx1p1 分片 1]
Searchd -->|並行分發| Local3[idx1p2 分片 2]
Local1 -->|部分結果| Searchd
Local2 -->|部分結果| Searchd
Local3 -->|部分結果| Searchd
Searchd -->|合併排序| Client
source src1 {
type = mysql
sql_query = SELECT id, text FROM documents
}
index idx1 {
type = plain
source = src1
}
searchd {
dist_threads = 0 # 預設單線程
}
# 基礎 source(共用參數)
source src1 {
type = mysql
sql_query = SELECT id, text FROM documents
}
# 3 個分片 source:按 id 取模分片
source src1p0 : src1 {
sql_query = SELECT id, text FROM documents WHERE id % 3 = 0
}
source src1p1 : src1 {
sql_query = SELECT id, text FROM documents WHERE id % 3 = 1
}
source src1p2 : src1 {
sql_query = SELECT id, text FROM documents WHERE id % 3 = 2
}
# 索引模板
index idx1_template {
type = plain
source = src1
}
# 3 個本地分片索引
index idx1p0 : idx1_template { source = src1p0 }
index idx1p1 : idx1_template { source = src1p1 }
index idx1p2 : idx1_template { source = src1p2 }
# 分散式索引:聚合 3 個本地分片
index idx1 {
type = distributed
local = idx1p0
local = idx1p1
local = idx1p2
}
searchd {
dist_threads = 3 # 關鍵:啟用 3 線程並行查詢本地分片
}
indexer --all --rotate(分片可並行建立)searchd --config sphinx.confquery.log 中 dist_threads 執行情況| 策略 | 適用場景 | SQL 範例 | 優點 | 缺點 |
|---|---|---|---|---|
| ID 取模 | 主鍵均勻分佈 | WHERE id % N = k | 簡單、均勻 | 範圍查詢需掃全部分片 |
| 時間範圍 | 時間序列資料、熱數據集中 | WHERE created_at BETWEEN ... | 熱數據集中、冷數據可下線 | 需定期重新分片 |
| 業務分區 | 租戶/部門/類別隔離 | WHERE tenant_id = ... | 業務邏輯清晰 | 可能資料傾斜 |
| 輔助表映射 | 複雜分片規則 | JOIN shard_map ON ... | 彈性最大 | 維護成本高 |
dist_threads 倍,實測通常 2-3 核提升 1.5-2.5 倍dist_threads 過大可能 OOMindexer --all --rotate 自動並行建立本地分片max_matches:限制每分片返回行數,減少合併壓力rt 即時索引:配合 dist_threads 實現近實時並行搜尋cpu_time、wall_time、matches 分析並行效率Sphinx 分散式索引本地化是**零代碼變更、零架構調整**即可實現多線程搜尋的最佳方案。核心在於:合理分片策略 + dist_threads 並行 + 結果合併瓶頸評估。適合中大型全文搜尋場景,單機多核資源利用率可從 3% 提升至 50%+。