【问题标题】:Thinking Sphinx indexing performance思考 Sphinx 索引性能
【发布时间】:2015-06-18 11:13:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sphinx thinking-sphinx


    【解决方案1】:

    对此的“标准”狮身人面像解决方案是使用范围查询。

    http://sphinxsearch.com/docs/current.html#ex-ranged-queries

    ...将查询分成许多小部分,因此数据库服务器更有可能运行查询(而不是一个巨大的查询)

    但我不知道如何在 Thinking Sphinx 中真正启用它。在文档中看不到任何内容。可以帮助您编辑 sphinx.conf,但也不确定 TS 将如何处理您手动编辑配置文件。

    【讨论】:

    • 似乎连接字段会更好地解决我的索引性能问题:sphinxsearch.com/docs/current.html#conf-sql-joined-field。知道如何在 TS 中实现这一点吗?
    • 仔细查看要点通知现在已经进行了范围查询,您是否编辑了要点?如果不是抱歉没有注意到这一点。加入的字段也很有用,抱歉不知道TS能不能启用。
    • 不,我没有。我认为这是 TS 的标准配置。但是,您的建议仍然很有价值。如果我理解正确,范围查询可以提高搜索时间性能。我想提高索引时间性能。
    【解决方案2】:

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

    为每个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
    

    将字段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

    【讨论】:

    • 我来晚了!谢谢你的要点。我发现的一件事是您可以访问定义块内的@index,并且您可以在您的条件下执行@index.delta?,以避免将索引一分为二。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多