Es id in 查询大量数据很慢
1. 运行环境
1). 当前使用的 Laravel 版本?
laravel: 10
//: <> (使用 php artisan --version
命令查看)
2). 当前使用的 php/php-fpm 版本?
PHP 版本:8.2
php-fpm 版本:8.2
3). 当前系统
4). 业务环境
本地docker环境
//: <> (期待信息 开发环境
或 生产环境
)
//: <> (是否使用负载均衡?请提供相关信息)
5). 相关软件版本
es:7.13
2. 问题描述?
es 查询 trems:{ “id”: [ 1,2…. ] } id 集合有 1w个, 查询要15秒
api datas/_search
Params:
{
"query":{"terms":{"id":[2,3,4,5,6,7,8,9,10...]}},
"_source":["id","updated_at"]
}
3. 您期望得到的结果?
希望能快速查出 1w 个数据
4. 您实际得到的结果?
实际耗时:14753 ms
如果ID是ES中的主键,可以用 $params['body']['query']['ids'] = ['values' => array_values($ids)];
array_chunk 拆,再should
1.数据量是不是太多了,1w条,什么场景下需要直接查这么多,有没有可能分批量查询
一般情况下如果查询,你不可能看那么多吧。导出的话,直接搞成异步就可以了
ES 也没那么神奇,如果存储了大量的json 文本,其实这玩意查询范围大,也很慢
]['query']['ids'] = ['values' => array_values ($ids)] 这种查主键还是很快的,我15亿级别的数据,查询100个id,基本也就是30MS
你先去确定100,或是300条,500条的这种效率, $chunks = array_chunk($ids, 500); foreach ($chunks as $chunk) { yield 获取IDs; }
[另:一次查询一万条ID,不是业务有坑,就是逻辑有坑]