无论才能、知识多么卓著,如果缺乏热情,则无异纸上画饼充饥,无补于事。

ElasticSearch 的 numeric range 搜索性能如何?自己测试发现比 MySQL 还要慢

Elasticsearch | 作者 asdfping | 发布于2021年07月07日 | 阅读数:1596

测试详情:
数据结构为订单,包含 orderid(long 类型)、price(int 类型)、qty(int 类型)、level(int 类型)
4 个字段。
将 1000W 条上述格式的订单数据,分别写入 ES 和 MySQL,然后进行下述搜索操作:

搜索 qty 在 [a, b] 范围,且 level 在 [n,m] 范围的订单,按照 price 排序(升序),取前 50
的结果返回。

在 ES 中,使用 filter + bool 查询实现上述搜索功能,查询语句如下:
{
"query":{
"bool":{
"filter":[
"range":{
"qty":{
"lte":b,
"gte":a
}
},
"range":{
"level":{
"lte":m,
"gte":n
}
}
]
}
},
"sort":[
"price":{
"order":"asc"
}
],
"size":50,
"_source":false // 不返回完整的文档,只需要 id
}

在 MySQL 中,使用 SQL 语句 实现上述搜索。

MySQL 和 ES 都部署在同一台机器上(16core 32GB),数据量都是 1000W。进行搜索压测,发现 MySQL
的 qps 能达到 接近1000 / s,而 ES 只有 200-300/s。而且压测期间,在 MySQL 搜索时,CPU 都没
跑满,而在 ES 搜索时,CPU 都跑满了。

之后,我将查询中的 sort 去掉,只做范围过滤查询,但 qps 依然是在 300/s 左右的水平。
这样看来 ES 的范围查询性能很弱,不知是否如此,还是哪里需要调优?
已邀请:

Charele - Cisco4321

赞同来自:

这比较没有意义吧,又没说ES要一定比MySQL快。
各有各的用武之地。

asdfping

赞同来自:

倒不是纯粹为了比较,技术选型时做的测试,想知道 ES 的基于数值的范围查询是否性能就是这样?或者说是否有优化空间。

FFFrp

赞同来自:

毕竟是分布式的搜索引擎,多节点+ 多分片才能发挥它的能力

要回复问题请先登录注册