搜索
首页数据库mysql教程在MySQL中使用Sphinx实现多线程搜索的方法_MySQL

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

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在MySQL中使用视图的局限性是什么?在MySQL中使用视图的局限性是什么?May 14, 2025 am 12:10 AM

mysqlviewshavelimitations:1)他们不使用Supportallsqloperations,限制DatamanipulationThroughViewSwithJoinSorsubqueries.2)他们canimpactperformance,尤其是withcomplexcomplexclexeriesorlargedatasets.3)

确保您的MySQL数据库:添加用户并授予特权确保您的MySQL数据库:添加用户并授予特权May 14, 2025 am 12:09 AM

porthusermanagementInmysqliscialforenhancingsEcurityAndsingsmenting效率databaseoperation.1)usecReateusertoAddusers,指定connectionsourcewith@'localhost'or@'%'。

哪些因素会影响我可以在MySQL中使用的触发器数量?哪些因素会影响我可以在MySQL中使用的触发器数量?May 14, 2025 am 12:08 AM

mysqldoes notimposeahardlimitontriggers,butacticalfactorsdeterminetheireffactective:1)serverConfiguration impactactStriggerGermanagement; 2)复杂的TriggerSincreaseSySystemsystem load; 3)largertablesslowtriggerperfermance; 4)highConconcConcrencerCancancancancanceTigrignecentign; 5); 5)

mysql:存储斑点安全吗?mysql:存储斑点安全吗?May 14, 2025 am 12:07 AM

Yes,it'ssafetostoreBLOBdatainMySQL,butconsiderthesefactors:1)StorageSpace:BLOBscanconsumesignificantspace,potentiallyincreasingcostsandslowingperformance.2)Performance:LargerrowsizesduetoBLOBsmayslowdownqueries.3)BackupandRecovery:Theseprocessescanbe

mySQL:通过PHP Web界面添加用户mySQL:通过PHP Web界面添加用户May 14, 2025 am 12:04 AM

通过PHP网页界面添加MySQL用户可以使用MySQLi扩展。步骤如下:1.连接MySQL数据库,使用MySQLi扩展。2.创建用户,使用CREATEUSER语句,并使用PASSWORD()函数加密密码。3.防止SQL注入,使用mysqli_real_escape_string()函数处理用户输入。4.为新用户分配权限,使用GRANT语句。

mysql:blob和其他无-SQL存储,有什么区别?mysql:blob和其他无-SQL存储,有什么区别?May 13, 2025 am 12:14 AM

mysql'sblobissuitableForStoringBinaryDataWithInareLationalDatabase,而alenosqloptionslikemongodb,redis和calablesolutionsoluntionsoluntionsoluntionsolundortionsolunsolunsstructureddata.blobobobsimplobissimplobisslowderperformandperformanceperformancewithlararengelitiate;

mySQL添加用户:语法,选项和安全性最佳实践mySQL添加用户:语法,选项和安全性最佳实践May 13, 2025 am 12:12 AM

toaddauserinmysql,使用:createUser'username'@'host'Indessify'password'; there'showtodoitsecurely:1)choosethehostcarecarefullytocon trolaccess.2)setResourcelimitswithoptionslikemax_queries_per_hour.3)usestrong,iniquepasswords.4)Enforcessl/tlsconnectionswith

MySQL:如何避免字符串数据类型常见错误?MySQL:如何避免字符串数据类型常见错误?May 13, 2025 am 12:09 AM

toAvoidCommonMistakeswithStringDatatatPesInMysQl,CloseStringTypenuances,chosethirtightType,andManageEngencodingAndCollat​​ionsEttingsefectery.1)usecharforfixed lengengters lengengtings,varchar forbariaible lengength,varchariable length,andtext/blobforlabforlargerdata.2 seterters seterters seterters seterters

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能