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

Indexing 如何利用Sphinx多索引提高性能,indexing,sphinx,Indexing,Sphinx,我正在读一本关于Sphinx的书,书中提到,为了利用多个核心和Sphinx技术本身,我将不可避免地将一个大索引拆分为几个小索引,并在多索引查询中查询它们。然而,这本书没有进一步的细节 这方面的一般策略是什么?你是否只是简单地以一种类似于工会的方式进行拆分 index1: SELECT ... FROM table LIMIT 0, 1000 index2: SELECT ... FROM table LIMIT 1000, 1000 ... 然后你不时地重建这些碎片。当进行搜索时,不同的核心将

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

这方面的一般策略是什么?你是否只是简单地以一种类似于工会的方式进行拆分

index1: SELECT ... FROM table LIMIT 0, 1000
index2: SELECT ... FROM table LIMIT 1000, 1000
...
然后你不时地重建这些碎片。当进行搜索时,不同的核心将并行处理这些索引?或者,它与将较大索引中的现有项与添加到较小索引中的较新项分开有什么不同?还是将文本字段拆分为一个索引,将属性拆分为另一个?

好问题

Sphinx为每个本地索引搜索使用一个CPU核心,为索引时构建一个索引使用一个CPU核心

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

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

index index_main
{
        type            = distributed
        local           = index1
        local           = index2
}
其中index1index2是独立的索引。在这种情况下,您可以搜索索引\u main,sphinx将为您提供两个索引的聚合结果

关于分割数据,您可以利用您想要的所有技术,包括按范围、按散列或按属性值分割记录,以及以上任何组合

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

index index_main
{
        type            = distributed
        local           = index1
        local           = index2
}
对于第一个索引:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 0
sql\u query=从其中选择id、标题、描述(id%2)=0
第二:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 1
sql\u query=从中选择id、标题、描述(id%2)=1

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

@vfedorkov我使用了与你相同的方法,有多个索引,并使用模运算符(%)。。但是你能告诉我们你所说的%运算符有缺点是什么意思吗?我们有超过5000万个关键词,我在索引时使用了这个操作符,但它似乎很好。。虽然索引大约需要2~3个小时。。我们有大约8个索引,因为我们的服务器使用8个核心。。因此,我使用了id%8=1、id%8=2等。。