思考Sphinx索引表现

Jon*_*han 5 sphinx thinking-sphinx

我有一个很大的索引定义,索引时间太长.我怀疑主要问题是由生成的许多LEFT OUTER JOIN引起的.

我看到了这个问题,但找不到有关使用的文档source: :query,这似乎是解决方案的一部分.

我的索引定义和结果查询可以在这里找到:https://gist.github.com/jonsgold/fdd7660bf8bc98897612

如何在索引编制期间优化生成的查询以更快地运行?

Jon*_*han 1

这是最有效的解决方案(来自链接的问题)。基本上,您可以删除主查询的一部分sql_query并将其单独定义为文件sql_joined_field中的a sphinx.conf

sql_joined_field将所有相关的 sql 条件添加到每个条件(例如按 ID 取模来分片索引)非常重要。这是新的定义:

ThinkingSphinx::Index.define(
  :incident,
  with: :active_record,
  delta?: false,
  delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
    indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
    ...
    has
    ...
end

ThinkingSphinx::Index.define(
  :incident,
  with: :active_record,
  delta?: true,
  delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta)
) do
    indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND incidents.delta = 1 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query
    ...
    has
    ...
end
Run Code Online (Sandbox Code Playgroud)

site将字段定义为单独查询的神奇之处在于source: :query该行末尾的选项。

请注意,核心索引定义具有参数delta?: false,而增量索引定义具有参数delta?: true。这样我就可以使用WHERE incidents.delta = 1增量索引中的条件并过滤掉不相关的记录。

我发现分片的性能并没有更好,所以我恢复到一个统一索引。

请参阅此处的整个索引定义: https: //gist.github.com/jonsgold/05e2aea640320ee9d8b2

重要的是要记住!

Sphinx 文档 ID 偏移量必须手动处理。也就是说,每当添加或删除另一个模型的索引时,我计算出的文档 ID 就会发生变化。这必须更新。

因此,在我的示例中,如果我为不同的模型添加了索引(不是:incident),我将必须运行rake ts:configure以找出新的偏移量并进行incidents.id * 51 + 7相应的更改。