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

 更新时间:2015年06月26日 09:32:22   投稿:goldensun  
这篇文章主要介绍了在MySQL中使用Sphinx实现多线程搜索的方法,修改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可以如此容易的扩展到你所需要的足够多的机器上,并且这种方式在很多年前就已经在被使用了。然后,我想,我并没有和我往常一样,利用这个特性来使得在一台机器上的查询变得更快。嗯,这并不是在说它很慢或者其实什么,只是,查询永远不会太快,不是吗?

相关文章

  • MySQL用limit方式实现分页的实例方法

    MySQL用limit方式实现分页的实例方法

    在本篇文章中小编给大家整理了一篇关于MySQL用limit方式实现分页的实例方法,有需要的朋友们可以参考学习下。
    2020-01-01
  • MySQL优化案例之隐式字符编码转换

    MySQL优化案例之隐式字符编码转换

    这篇文章主要介绍了MySQL优化案例之隐式字符编码转换,隐式类型转换也会导致同样的放弃走树搜索,更多相关内容具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • 详解mysql基本操作语句命令

    详解mysql基本操作语句命令

    本文介绍了 链接Mysql,以及增删改查等功能,需要的朋友可以参考
    2017-04-04
  • 查询MySQL中的树型表两种方法

    查询MySQL中的树型表两种方法

    在 MySQL中查询树型表(即具有层级结构的表)可以使用递归查询或者使用嵌套集模型,下面介绍两种方法查询MySQL中的树型表,感兴趣的朋友一起看看吧
    2024-01-01
  • mysql查询上下级机构的方法实例

    mysql查询上下级机构的方法实例

    大家应该都知道表里有上下级机构的,下面这篇文章主要给大家介绍了关于mysql查询上下级机构的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • mysql kill进程后出现killed死锁问题及解决

    mysql kill进程后出现killed死锁问题及解决

    这篇文章主要介绍了mysql kill进程后出现killed死锁问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL 获得当前日期时间的函数小结

    MySQL 获得当前日期时间的函数小结

    MySQL 获得当前日期时间的函数小结,需要的朋友可以参考下。
    2011-12-12
  • MySQL8.0.3 RC版即将发布 先来看看有哪些变化

    MySQL8.0.3 RC版即将发布 先来看看有哪些变化

    MySQL8.0.3 RC版即将发布,这篇文章主要介绍了MySQL8.0.3 RC版的一些新变化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 安全地关闭MySQL服务的教程

    安全地关闭MySQL服务的教程

    这篇文章主要介绍了安全地关闭MySQL服务的教程,包括使用kill指令时的一些注意点,需要的朋友可以参考下
    2015-11-11
  • mysql删除语句超详细汇总

    mysql删除语句超详细汇总

    这篇文章主要给大家介绍了关于mysql删除语句超详细汇总的相关资料,SQL是用于访问和处理数据库的标准的计算机语言,简称结构化查询语言,SQL中的删除语句有多种方法,这里总结下,需要的朋友可以参考下
    2023-08-08

最新评论