【问题标题】:Sphinx or mysql on joined tables连接表上的 Sphinx 或 mysql
【发布时间】:2013-03-06 12:21:27
【问题描述】:

我的数据库中有几个表,这些表需要大量连接来处理所涉及的查询,并且表会经常更新。关于从 mysql 搜索过渡到 sphinx 搜索,我想提出不同的问题。

我正在尝试使用 Sphinx 来执行查询(不是全文搜索),因为 mysql 引擎由于涉及大量连接而太慢。

所以我的第一个问题是,通过连接将字段转换为文本,使用 sphinx 进行非全文搜索是否有意义?

如果建议使用 sphinx,我如何使用它来跨所有这些表执行复杂的查询。我进行了很多研究并提出了这三个备选方案,并希望您对哪个是最佳方案提出意见。

  1. 由于 Sphinx 没有 JOIN,因此将所有表反规范化为一个表(或视图),然后在其上运行 sphinx 索引器。这似乎是最低效的方式,因为它会产生数十亿行,而且不涉及连接所有表的其他查询也会受到严重阻碍。
  2. 分别在每个表上创建 sphinx 索引。但这不允许我将这些索引用于需要跨表连接的查询。为了克服这个问题,请在要连接的列上使用 sql_joined_field,然后 sphinx 将执行连接过程。
  3. 将 JOIN 放入构建索引的 sql_query 中。表保持规范化,但您在构建索引时取消规范化。这似乎是一个很好的解决方案。但是父表上会有很多更新/删除/插入。那么,相应地更新 spinx 索引是否会是一件棘手或乏味的事情,并且从长远来看,在更新太多之后会影响性能吗?如何处理父表中的更新并有效地修改 sphinx 索引。

我想知道解决该问题的更好方法是什么。抱歉这个问题太长了,但我想汇总我的研究,以免在接下来的答案中重复同样的事情。

【问题讨论】:

    标签: mysql join indexing sphinx


    【解决方案1】:

    是的,我会推荐 3 个。

    阅读有关 main+delta 更新的信息,以获取快速索引更新的方法(无需重建整个索引)

    http://sphinxsearch.com/docs/current.html#delta-updates

    【讨论】:

    • 感谢您的建议。不过我有一个疑问。从表面上看,增量更新似乎适用于从一个表派生的索引,而不是从跨多个表的连接派生的索引。该技术可以用于我正在处理的问题吗?
    • 是的,没有理由不这样做。我将增量索引与 4 个表的连接一起使用。使用计数器表的“过滤器”应该(不是必须)过滤列表中的第一个表,但它可以很好地连接其他表。
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多