我正在读一本关于Sphinx的书,它提到为了利用多核和Sphinx技术本身,我不可避免地要将一个大索引拆分成较小的索引并在多索引查询中查询它们。然而,本书没有进一步详述。
这是什么一般策略?你是否只是以类似UNION的方式拆分它,例如
index1: SELECT ... FROM table LIMIT 0, 1000
index2: SELECT ... FROM table LIMIT 1000, 1000
...
然后你不时重建这些作品。在进行搜索时,不同的核心将并行处理这些索引?或者它是否有所不同,例如将较大索引中的现有项目和较新的项目分离到较小的索引中?或者将文本字段分成一个索引,将属性分成另一个?
答案 0 :(得分:10)
很棒的问题。
Sphinx在每个单独的本地索引搜索中使用一个CPU核心,在索引时使用一个CPU核心来构建一个索引
如果您有两个索引,则可以同时运行两个索引器并使用两个CPU核心。请注意索引是IO密集型任务,因此不要运行太多的索引器。
一旦你有两个(或更多)索引,你可以通过在搜索查询中提及所有索引或使用分布式索引来同时搜索它们:
index index_main
{
type = distributed
local = index1
local = index2
}
其中 index1 和 index2 是单独的索引。在这种情况下,您可以搜索 index_main ,sphinx将为您提供两个索引的汇总结果
关于拆分数据,您可以利用所需的所有技术,包括按范围,散列或属性值以及上述所有组合分割记录。
我最喜欢的是使用modulo来确定索引号,如下所示:
对于第一个索引:
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
这种方法有一些缺点,但一般来说,如果你没有大量的数据,这是一个很好的开始。