MySQL,狮身人面像,和许多数据库和搜索引擎都是单线程的查询,例如,查询是一个r910服务器有32个CPU核心和16个磁盘执行,它使用了一个核心,在大多数磁盘。是的,只有一个会使用。

如果查询是CPU密集型的工作,它将用大约3%整个机器的CPU能力(以上32核心机为例)。如果磁盘密集型,然后用6%的IO(及以上具有相同的配置,16个磁盘RAID10或RAID0)。

换一种说法,如果在单核单盘机器上执行查询,在一台有32个内核和16个磁盘的机器上运行相同的查询需要10秒。需要10秒而没有任何改进。

你早知道,对吧所以,我的问题是,是否有办法改善它

如果是狮身人面像,那太好了,答案是!你不必花太多的时间,你甚至不需要修改应用程序和数据库,只是为了改变狮身人面像的配置。

计划

首先,让我解释一下我们的目标。

狮身人面像本身支持分布式搜索,已设计了很久很久以前。如果机器中的指数并不适合,可以使索引的不同部位的多台机器上,设置一个总结,负责从应用程序接收到一个请求,然后请求和所有的数据节点,结果他们一起回来,返回到应用程序。它看起来就像只有一个服务器服务。



好的,你猜下一个是什么哈,我们可以把这个功能应用到一台机器上,使我们的查询超过N倍的速度。现在狮身人面像已经支持这种方法,所以我们不必假装去查询哪个远程节点。

另一个优点是,在配置分布式搜索之后,索引可以并行构建!

虽然这种方法可以加速大多数查询,但仍有一些注意事项,但也有一些例外,因为并行查询结果仍然需要合并,合并过程是单线程的,而且合并包括一些CPU密集型操作,例如分级、排序,甚至使用组计算。如果数据量很大,合并过程将成为瓶颈。

要确认这一点也是很简单的,只要我们查看一下狮身人面像的查询日志,看看每个查询的记录有多少匹配,我们就会记住一个好的数字。

实施

假设服务器上的索引配置如下(省略了许多细节):

复制代码代码如下所示:

源先

{

类型= MySQL

sql_query =选择ID,文字表

}



索引IDX1

{

类型=平原

其源=

}



searchd

{

dist_threads = 0 #默认

}

现在我们用一机3用CPU内核和磁盘做这个指标--这IDX1。是我们更改的配置文件吗:

复制代码代码如下所示:

源先

{

类型= MySQL

sql_query =选择ID,文字表

}



源src1p0:越界

{

sql_query =选择ID,查到ID为3 = 0的文本;

}



源src1p1:越界

{

sql_query =选择ID,查到ID为3 = 1的文本;

}



源src1p2:越界

{

sql_query =选择ID,查到ID为3 = 2的文本;

}



指数idx1_template

{

类型=平原

其源=

}



指数idx1p0:idx1_template

{

src0源=

}



指数idx1p1:idx1_template

{

其源=

}



指数idx1p2:idx1_template

{

源= SRC2

}



索引IDX1

{

类型分布

当地= idx1p0

当地= idx1p1

当地= idx1p2

}



searchd

{

dist_threads = 3

}

完成此操作后,需要重建索引。但现在idx1p0到idx1p2索引索引命令可以同步进行。

另外,从不同的操作中分离数据不是最好的方法。你可以使用一个辅助表在MySQL中区分它们的范围,并使用sql_query_range使用或者别的什么,取决于你的数据。

写到底

我一直喜欢狮身人面像,狮身人面像可以扩展到你所需要的足够的机器,而且这种方式已经在很多年前被使用了,然后,我想,我并没有像平常那样使用这个功能使机器的查询速度更快,但是,这并不是说它很慢或者什么,但是它不会太快,不是吗