如何利用Sphinx多个索引来提高性能

Eug*_*ene 5 indexing sphinx

我正在读一本关于Sphinx的书,它提到为了利用多核和Sphinx技术本身,我不可避免地要将一个大索引拆分成较小的索引并在多索引查询中查询它们.然而,本书没有进一步详述.

这个的一般策略是什么?你只是简单地以类似UNION的方式拆分它,例如

index1: SELECT ... FROM table LIMIT 0, 1000
index2: SELECT ... FROM table LIMIT 1000, 1000
...
Run Code Online (Sandbox Code Playgroud)

然后你不时重建这些作品.在进行搜索时,不同的核心将并行处理这些索引?或者它是否有所不同,例如将较大索引中的现有项目和较新的项目分离到较小的索引中?或者将文本字段分成一个索引,将属性分成另一个?

小智 10

好问题.

Sphinx在每个单独的本地索引搜索中使用一个CPU核心,在索引时使用一个CPU核心来构建一个索引

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

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

index index_main
{
        type            = distributed
        local           = index1
        local           = index2
}
Run Code Online (Sandbox Code Playgroud)

其中index1index2是单独的索引.在这种情况下,您可以搜索index_main,sphinx将为您提供两个索引的聚合结果

关于拆分数据,您可以利用所需的所有技术,包括按范围,散列或属性值拆分记录,以及上述所有组合.

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

对于第一个索引:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 0
Run Code Online (Sandbox Code Playgroud)

第二个:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 1
Run Code Online (Sandbox Code Playgroud)

这种方法有一些缺点,但一般来说,如果你没有大量的数据,这是一个很好的开始.