萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Sphinx 增量索引與分布式索引架構實戰:主索引+增量索引+分布式合並

Sphinx 大數據量全文檢索架構:主索引、增量索引、分布式索引三層設計

單一全量索引重建耗時長、業務不可用。生產環境採用「主索引(全量,低頻重建)+ 增量索引(新增數據,高頻重建)+ 分布式索引(邏輯合併查詢)」三層架構,實現近實時檢索與低維護成本。

一、核心表結構與計數器表


-- 記錄主索引已構建的最大文檔 ID
CREATE TABLE sph_counter (
  counter_id INT PRIMARY KEY,
  max_doc_id INT NOT NULL
);
INSERT INTO sph_counter VALUES (1, 0);

二、sphinx.conf 三層索引配置

1. 主索引源(全量)


source myorder
{
  type = mysql
  sql_host = localhost
  sql_user = root
  sql_pass =
  sql_db = test
  sql_query_pre = SET NAMES utf8
  sql_query_pre = SET SESSION query_cache_type=OFF
  # 更新計數器:記錄當前最大 id
  sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM orders
  sql_query = \
    SELECT a.id, a.user_id, b.username, \
           UNIX_TIMESTAMP(a.create_time) AS create_time, \
           a.product_name, a.summary \
    FROM orders a LEFT JOIN users b ON a.user_id = b.user_id
  sql_attr_uint = user_id
  sql_field_string = username
  sql_field_string = product_name
  sql_attr_timestamp = create_time
  sql_ranged_throttle = 0
}

index myorder  -- 主索引
{
  source = myorder
  path = /usr/local/sphinx2/var/data/myorder
  docinfo = extern
  mlock = 0
  morphology = none
  min_word_len = 1
  html_strip = 1
  charset_table = ...  # 完整中文 ngram 字符集
  ngram_len = 1
  ngram_chars = U+4E00..U+9FBF, ...
}

2. 增量索引源(僅新增)


source moreorder : myorder  -- 繼承主源配置
{
  # 僅查詢 id 大於計數器記錄的最大值
  sql_query = \
    SELECT a.id, a.user_id, b.username, \
           UNIX_TIMESTAMP(a.create_time) AS create_time, \
           a.product_name, a.summary \
    FROM orders a LEFT JOIN users b ON a.user_id = b.user_id \
    WHERE a.id > (SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
}

index moreorder : myorder  -- 增量索引繼承主索引屬性
{
  source = moreorder
  path = /usr/local/sphinx2/var/data/moreorder
}

3. 分布式索引(邏輯合併)


index mytest
{
  type = distributed
  local = myorder    # 本地主索引
  local = moreorder  # 本地增量索引
  # agent = 192.168.10.103:9313:myuser  # 遠程分片(可選)
  agent_connect_timeout = 1000
  agent_query_timeout = 3000
}

三、日常維護操作流程

1. 新增業務數據


INSERT INTO users (username) VALUES ('張三瘋'), ('張四瘋');
INSERT INTO orders (user_id, product_name, summary) VALUES
(1311895266, '我了個XX', '苛奪asdfasdfasdf'),
(1311895267, 'iasdfasdf', '好苛奪花樣百出頂戴要');

2. 重建增量索引(秒級完成)


/usr/local/sphinx2/bin/indexer --config /usr/local/sphinx2/etc/sphinx.conf --rotate moreorder

--rotate 通知 searchd 熱加載新索引文件,無需重啟服務。

3. 查詢驗證


-- 分布式索引自動合併主+增量結果
mysql -h 127.0.0.1 -P 9306
SELECT * FROM mytest WHERE MATCH('張');
-- 返回主索引 4 條 + 增量 2 條 = 6 條

四、定期合併:增量併入主索引

增量索引過大時(如超過主索引 10-20%),執行合併:


/usr/local/sphinx2/bin/indexer --config /usr/local/sphinx2/etc/sphinx.conf --merge myorder moreorder --rotate
  • --merge 將 moreorder 合併入 myorder,合併後 moreorder 可清空重建
  • 合併過程會短暫佔用 CPU/IO,建議低峰期執行
  • 合併後 sph_counter 最大 ID 自動更新(下次全量重建時)

五、架構優勢總結

層級重建頻率數據範圍構建耗時查詢可見性
主索引天/週全量歷史長(小時級)基線數據
增量索引分/時新增數據極短(秒級)近實時新數據
分布式索引無需重建邏輯聯集無統一查詢入口

配合 crontab 定時任務:每 5 分鐘重建增量、每天凌晨合併、每週重建全量,構建穩定可靠的檢索服務。

copyright © 萬盛學電腦網 all rights reserved