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 的范围查询性能很弱,不知是否如此,还是哪里需要调优?
数据结构为订单,包含 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 的范围查询性能很弱,不知是否如此,还是哪里需要调优?
3 个回复
Charele - Cisco4321
赞同来自:
各有各的用武之地。
asdfping
赞同来自:
FFFrp
赞同来自: