闲来无事开发了一个ES的客户端,然后在查询数据的时候,使用了_id排序,测试环境上面用起来也没啥事,可到了线上就跪了,线上数据量是1.4亿左右,直接没有给相应的反应时间,只要一查询,立马就宕机。
查询了ES的官网说明:_id字段被禁止在聚合、排序和脚本中使用。如果需要对_id字段进行排序或聚合,建议将_id字段的内容复制到doc_values的字段中。
为什么_id字段会导致内存占满呢?利用_id进行排序的时候,ES会把所有的_id字段都加载到fielddata cache里面,而不是像我们在MySQL里面进行排序一样,先执行过滤条件,把符合条件的数据加载到内存里面再排序,于是当该系统跑到线上运行之后,线上的数据量过大就会导致内存被耗尽。
当出现了此值情况之后该如何处理呢?如何清理掉fielddata cache占用的内存呢?可以使用缓存清理命令:curl -X POST “ip:port/_all/_cache/clear”
版权声明:本文为duzm200542901104原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。