数码资讯
基于MySQL的狮身人面像多线程搜索方法
MySQL,狮身人面像,和许多数据库和搜索引擎都是单线程的查询,例如,查询是一个r910服务器有32个CPU核心和16个磁盘执行,它使用了一个核心,在大多数磁盘。是的,只有一个会使用。 如果查询是CPU密集型的工作,它将用大约3%整个机器的CPU能力(以上32核心机为例)。如果磁盘密集型,然后用6%
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
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使用或者别的什么,取决于你的数据。
写到底
我一直喜欢狮身人面像,狮身人面像可以扩展到你所需要的足够的机器,而且这种方式已经在很多年前被使用了,然后,我想,我并没有像平常那样使用这个功能使机器的查询速度更快,但是,这并不是说它很慢或者什么,但是它不会太快,不是吗
如果查询是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使用或者别的什么,取决于你的数据。
写到底
我一直喜欢狮身人面像,狮身人面像可以扩展到你所需要的足够的机器,而且这种方式已经在很多年前被使用了,然后,我想,我并没有像平常那样使用这个功能使机器的查询速度更快,但是,这并不是说它很慢或者什么,但是它不会太快,不是吗
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。