当前位置: 首页 > 编程笔记 >

在MySQL中使用Sphinx实现多线程搜索的方法

夔高寒
2023-03-14
本文向大家介绍在MySQL中使用Sphinx实现多线程搜索的方法,包括了在MySQL中使用Sphinx实现多线程搜索的方法的使用技巧和注意事项,需要的朋友参考一下

 MySQL、Sphinx及许多数据库和搜索引擎中的查询是单线程的。比如说,在一台32个CPU核心、16个磁盘的R910服务器上执行一个查询,它最多只会用到一个核心和一个磁盘。没错,只会使用一个。

如果查询是CPU密集型作业,那么会使用大约3%的整机CPU能力(以上述32核机器为例)。如果是磁盘密集型,则大约会使用6%的整机IO能力(也是与上例同样的配置,16个磁盘组成RAID10或RAID0)。

我再换个说法吧。如果你在一台单核单磁盘的机器上执行了某个查询,花了10秒,那么把同样的查询放到一台32核16磁盘的机器上去跑,同样需要10秒,不会有丝毫改善。

你早就知道这一点了,对吧?那么,我的问题是——有没有办法可以改善呢?

如果是Sphinx,太棒了,答案是有!而且不需要花上太多的工夫。你甚至不需要修改应用和数据库,只需要稍微改下Sphinx的配置。

计划

首先,我来说明一下我们的目标。

Sphinx本身就支持分布式搜索,在很久以前就已经朝着水平扩展的目标来设计。如果索引在一台机器上放不下,可以让多台机器分别对不同的部分进行索引,设置一个聚合节点,负责从应用接收请求,然后把请求再同时发给所有的数据节点,最后将它们返回的结果合并起来,返回给应用。在应用看起来,就好像只有一台服务器在为它服务。


好,下面你猜怎么着?哈,我们可以把这个功能应用到单台机器上,让我们的查询快上n多倍。而且,现在Sphinx已经支持这种做法了,所以我们根本不用再假装查询哪些远程节点。

还有另外一个好处,配置分布式搜索以后,索引是可以并行建的!

还是有一点需要注意,虽然这种做法可以加速绝大多数的查询,但还是有一些例外的情况。因为,并行的查询结果仍然需要合并起来,而这个合并过程是单线程的。而且,合并包括一些CPU密集的操作,如分级、排序,甚至用GROUP BY进行COUNT,如果数据量很大,合并过程就会变成瓶颈。

要确认这一点也很简单,只要查看Sphinx的查询日志,看看每个查询匹配的记录数有多少,我们就心里有数了。

执行

假设在服务器上一个索引配置如下 (很多细节都省略了):
 


source src1

{

    type = mysql

    sql_query = SELECT id, text FROM table

}

 

index idx1

{

    type = plain

    source = src1

}

 

searchd

{

    dist_threads = 0 # default

}

现在我们使用有3个CPU核心和磁盘的机器来做这个索引--就是这个idx1.下面是我们更改的配置文件 :

 


source src1

{

    type = mysql

    sql_query = SELECT id, text FROM table

}

 

source src1p0 : src1

{

    sql_query = SELECT id, text FROM table WHERE id % 3 = 0;

}

 

source src1p1 : src1

{

    sql_query = SELECT id, text FROM table WHERE id % 3 = 1;

}

 

source src1p2 : src1

{

    sql_query = SELECT id, text FROM table WHERE id % 3 = 2;

}

 

index idx1_template

{

    type = plain

    source = src1

}

 

index idx1p0 : idx1_template

{

    source = src0

}

 

index idx1p1 : idx1_template

{

    source = src1

}

 

index idx1p2 : idx1_template

{

    source = src2

}

 

index idx1

{

    type = distributed

    local = idx1p0

    local = idx1p1

    local = idx1p2

}

 

searchd

{

    dist_threads = 3

}

做完这些后,你需要重建索引. 但是现在idx1p0到idx1p2的索引indexer命令可以同步进行.

另外,用不同的操作来分离数据不是最好的办法, 你可以在MYSQL中用一个辅助表来区分它们的范围, 配合 sql_query_range使用或是别的什么, 具体根据你的数据来决定.

写在最后

我一直都很喜欢 Sphinx,Sphinx可以如此容易的扩展到你所需要的足够多的机器上,并且这种方式在很多年前就已经在被使用了。然后,我想,我并没有和我往常一样,利用这个特性来使得在一台机器上的查询变得更快。嗯,这并不是在说它很慢或者其实什么,只是,查询永远不会太快,不是吗?

 类似资料:
  • 本文向大家介绍php mysql like 实现多关键词搜索的方法,包括了php mysql like 实现多关键词搜索的方法的使用技巧和注意事项,需要的朋友参考一下 或者叫,分词检索数据库 $res = mysql_query("select * from peter where id like '%中草药%' and '%6%'"); //这样写是报错的; $res = mysql_query

  • 本文向大家介绍在IOS中为什么使用多线程及多线程实现的三种方法,包括了在IOS中为什么使用多线程及多线程实现的三种方法的使用技巧和注意事项,需要的朋友参考一下 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个

  • 问题内容: 我正在努力创建一个搜索多个单词的搜索。我的第一次尝试没有任何结果,结果如下: 我还尝试了以下方法,这些方法产生了结果,但是正如您可以想象的那样,我输入的每个单词都得到了重复的结果: 我对如何进行此操作非常迷惑,不胜感激。 编辑: 问题答案: 我已经在同一个主题(搜索关键字)上工作了一段时间,这是我的工作方式: -现在这就是我尝试使用FULLTEXT搜索运行它的样子:但是您应该将表类型设

  • 本文向大家介绍nodejs中使用多线程编程的方法实例,包括了nodejs中使用多线程编程的方法实例的使用技巧和注意事项,需要的朋友参考一下 在以前的博文别说不可能,nodejs中实现sleep中,我向大家介绍了nodejs addon的用法。今天的主题还是addon,继续挖掘c/c++的能力,弥补nodejs的弱点。 我曾多次提到过nodejs的性能问题。其实就语言本身而言,nodejs的性能还是

  • 问题内容: 我是SQL编程的新手。 我有一个表的工作,其中字段是,,,,,,。 我想从前端实施 关键字搜索 。关键字可以位于上表的任何字段中。 这是我尝试过的查询,但包含许多重复的行: 问题答案: 对于VARCHAR字段上的单个关键字,可以使用: 对于描述,通常最好添加全文索引并进行全文搜索(仅适用于MyISAM):

  • 我已经开始开发我的第一个MySQL数据库,我遇到了一个简单的问题。 我将我的电影按“多对多”关系进行分类: 我试图做的是按类型搜索我的电影表,并显示每部电影的所有类型,例如: 这是一个我用来搜索恐怖电影的查询 我遇到的问题是,这个查询在筛选之前检索所有表的全部,我收集的结果非常低效。有没有更好的方法可以在显示所有相关类型的同时按一种类型搜索?