【问题标题】:How to take advantage of Sphinx multiple indexes to improve performance如何利用 Sphinx 多个索引来提高性能
【发布时间】:2012-06-03 22:46:59
【问题描述】:

我正在阅读一本关于 Sphinx 的书,其中提到为了利用多核和 Sphinx 技术本身,我将不可避免地不得不将一个大索引拆分为更小的索引并在多索引查询中查询它们.然而,这本书并没有涉及任何进一步的细节。

对此的一般策略是什么?您是否只是以类似 UNION 的方式拆分它,例如

index1: SELECT ... FROM table LIMIT 0, 1000
index2: SELECT ... FROM table LIMIT 1000, 1000
...

然后你不时重建这些碎片。当进行搜索时,不同的核心会并行处理这些索引吗?还是有一些不同的东西,比如将现有项目分离到更大的索引中,而将新项目添加到较小的索引中?还是将文本字段分成一个索引,将属性分成另一个?

【问题讨论】:

    标签: indexing sphinx


    【解决方案1】:

    好问题。

    Sphinx 每个本地索引搜索使用一个 CPU 内核,并在索引时使用一个 CPU 内核构建一个索引

    如果您有两个索引,您可以同时运行两个索引器并使用两个 CPU 内核。请注意索引是 IO 密集型任务,因此不要运行太多索引器。

    一旦您有两个(或更多)索引,您可以通过在搜索查询中提及所有索引或使用这样的分布式索引来同时搜索它们:

    index index_main
    {
            type            = distributed
            local           = index1
            local           = index2
    }
    

    其中 index1index2 是单独的索引。在这种情况下,您可以针对 index_main 进行搜索,sphinx 将为您提供两个索引的汇总结果

    关于拆分数据,您可以利用所有您想要的技术,包括按范围、哈希或属性值以及以上所有方式的任意组合拆分记录。

    我最喜欢的是使用模来确定索引号,如下所示:

    对于第一个索引:

    sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 0
    

    第二个:

    sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 1
    

    这种方法有一些缺点,但总的来说,如果您没有大量数据,这是一个好的开始。

    【讨论】:

    • @vfedorkov 我使用了与您相同的方法,具有多个索引并使用模运算符 (%).. 但是您能否告诉我们您对 % 运算符有缺点的意思?我们有超过 5000 万个关键字,我在索引时使用了这个运算符,但它看起来不错.. 虽然索引需要大约 2~3 个小时.. 我们有大约 8 个索引,因为我们的服务器使用 8 个内核..因此我使用了 id % 8 = 1、id % 8 = 2 等。
    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2011-09-17
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多