国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

在MySQL中使用Sphinx實現(xiàn)多線程搜索的方法

2024-07-24 12:45:55
字體:
供稿:網(wǎng)友

 MySQL、Sphinx及許多數(shù)據(jù)庫和搜索引擎中的查詢是單線程的。比如說,在一臺32個CPU核心、16個磁盤的R910服務(wù)器上執(zhí)行一個查詢,它最多只會用到一個核心和一個磁盤。沒錯,只會使用一個。

如果查詢是CPU密集型作業(yè),那么會使用大約3%的整機(jī)CPU能力(以上述32核機(jī)器為例)。如果是磁盤密集型,則大約會使用6%的整機(jī)IO能力(也是與上例同樣的配置,16個磁盤組成RAID10或RAID0)。

我再換個說法吧。如果你在一臺單核單磁盤的機(jī)器上執(zhí)行了某個查詢,花了10秒,那么把同樣的查詢放到一臺32核16磁盤的機(jī)器上去跑,同樣需要10秒,不會有絲毫改善。

你早就知道這一點了,對吧?那么,我的問題是——有沒有辦法可以改善呢?

如果是Sphinx,太棒了,答案是有!而且不需要花上太多的工夫。你甚至不需要修改應(yīng)用和數(shù)據(jù)庫,只需要稍微改下Sphinx的配置。

計劃

首先,我來說明一下我們的目標(biāo)。

Sphinx本身就支持分布式搜索,在很久以前就已經(jīng)朝著水平擴(kuò)展的目標(biāo)來設(shè)計。如果索引在一臺機(jī)器上放不下,可以讓多臺機(jī)器分別對不同的部分進(jìn)行索引,設(shè)置一個聚合節(jié)點,負(fù)責(zé)從應(yīng)用接收請求,然后把請求再同時發(fā)給所有的數(shù)據(jù)節(jié)點,最后將它們返回的結(jié)果合并起來,返回給應(yīng)用。在應(yīng)用看起來,就好像只有一臺服務(wù)器在為它服務(wù)。


好,下面你猜怎么著?哈,我們可以把這個功能應(yīng)用到單臺機(jī)器上,讓我們的查詢快上n多倍。而且,現(xiàn)在Sphinx已經(jīng)支持這種做法了,所以我們根本不用再假裝查詢哪些遠(yuǎn)程節(jié)點。

還有另外一個好處,配置分布式搜索以后,索引是可以并行建的!

還是有一點需要注意,雖然這種做法可以加速絕大多數(shù)的查詢,但還是有一些例外的情況。因為,并行的查詢結(jié)果仍然需要合并起來,而這個合并過程是單線程的。而且,合并包括一些CPU密集的操作,如分級、排序,甚至用GROUP BY進(jìn)行COUNT,如果數(shù)據(jù)量很大,合并過程就會變成瓶頸。

要確認(rèn)這一點也很簡單,只要查看Sphinx的查詢?nèi)罩?,看看每個查詢匹配的記錄數(shù)有多少,我們就心里有數(shù)了。

執(zhí)行

假設(shè)在服務(wù)器上一個索引配置如下 (很多細(xì)節(jié)都省略了):
 

復(fù)制代碼 代碼如下:

source src1
{
    type = mysql
    sql_query = SELECT id, text FROM table
}
 
index idx1
{
    type = plain
    source = src1
}
 
searchd
{
    dist_threads = 0 # default
}

現(xiàn)在我們使用有3個CPU核心和磁盤的機(jī)器來做這個索引--就是這個idx1.下面是我們更改的配置文件 :
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 芷江| 屏边| 彰武县| 大渡口区| 巴林右旗| 云南省| 长白| 罗源县| 德令哈市| 苏尼特左旗| 故城县| 进贤县| 涟水县| 河源市| 浏阳市| 亳州市| 洪泽县| 巴塘县| 青浦区| 冕宁县| 桓仁| 舞阳县| 淳安县| 团风县| 哈巴河县| 宁都县| 德州市| 南木林县| 静安区| 巫山县| 中宁县| 隆子县| 台东市| 外汇| 朝阳县| 平原县| 奎屯市| 资兴市| 体育| 涡阳县| 丰顺县|