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

mysqloffersvariouscharactersetsforstringdatatypes:1)latin1 forwesterneuropeanlanguages,2)utf8 formultingualsupport,3)utf8mb4f OREXTEDENDENDENENICODECLUDINGEMOJIS,4)UCS2FORIXED-WIDTHENCODING,5)assiiforbasiclatin.ChoosideStherightStetSetensensersdaintegrity

流式傳輸BLOB確實比直接存儲更好,因為它能減少內存使用和提高性能。 1)通過逐步讀取和處理文件,避免了數據庫膨脹和性能下降。 2)流式傳輸需要更複雜的代碼邏輯,且可能增加I/O操作次數。

mySqlStringTypesimpactStorageAndPerformanCeaseAsfollows:1)長度,始終使用theSamestoragespace,whatcanbefasterbutlessspace-felfficity.2)varCharisvariable varcharisvariable length,morespace-morespace-morespace-effficitybuteftife buteftife butfority butfority textifforlyslower.3)

mysqlStringTypesIncludeVarChar,文本,char,Enum和set.1)varCharisVersAtileForvariable-lengthStringStringSuptoPuptOuptoPepePecifiedLimit.2)textisidealforlargetStortStorStoverStoverStorageWithoutAutAdefinedLength.3)charlisfixed-lenftenge,for forConsistentDatalikeCodes.4)

MySQLoffersvariousstringdatatypes:1)CHARforfixed-lengthstrings,2)VARCHARforvariable-lengthtext,3)BINARYandVARBINARYforbinarydata,4)BLOBandTEXTforlargedata,and5)ENUMandSETforcontrolledinput.Eachtypehasspecificusesandperformancecharacteristics,sochoose

TograntpermissionstonewMySQLusers,followthesesteps:1)AccessMySQLasauserwithsufficientprivileges,2)CreateanewuserwiththeCREATEUSERcommand,3)UsetheGRANTcommandtospecifypermissionslikeSELECT,INSERT,UPDATE,orALLPRIVILEGESonspecificdatabasesortables,and4)

toadduserInmysqleffect和securly,跟隨台詞:1)USEtheCreateUserStattoDaneWuser,指定thehostandastrongpassword.2)GrantNecterAryAryaryPrivilegesSustherthing privilegesgeStatement,usifementStatement,adheringtotheprinciplelastprefilegege.3)

toaddanewuserwithcomplexpermissionsinmysql,loldtheSesteps:1)創建eTheEserWithCreateuser'newuser'newuser'@''localhost'Indedify'pa ssword';。 2)GrantreadAccesstoalltablesin'mydatabase'withGrantSelectOnMyDatabase.to'newuser'@'localhost';。 3)GrantWriteAccessto'


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境