当前位置: 首页 > article >正文

elasticsearch 数据库查询很慢如何优化

设备信息

elasticsearch 数据库查询很慢。
版本:7.16
单机版 、docker部署。资产、监控、报警数据都存在ES数据库中。
服务器:32G 内存 24核 存储1T
CPU型号:Intel® Xeon® Gold 6240 CPU @ 2.60GHz

Elasticsearch 查询慢的原因可能有很多,涉及到硬件配置、索引设计、查询语句、集群配置等多个方面。以下是一些常见的优化建议,适用于你的单机版 Elasticsearch 7.16 环境。

1. 硬件优化

1.1 内存分配

Elasticsearch 对内存的需求较高,建议分配足够的堆内存。默认情况下,Elasticsearch 会使用系统内存的 50% 作为堆内存,但不要超过 32GB(因为 JVM 的指针压缩机制在 32GB 以下更高效)。

  • 修改 JVM 堆内存
    编辑 elasticsearch.yml 文件,设置堆内存大小。

    sudo vi /etc/elasticsearch/jvm.options
    

    修改以下两行:

    -Xms16g
    -Xmx16g
    

    这里将堆内存设置为 16GB,你可以根据实际情况调整。

1.2 文件系统缓存

Elasticsearch 依赖操作系统的文件系统缓存来加速查询。确保系统有足够的空闲内存用于文件系统缓存。

  • 监控内存使用
    使用 free -h 命令查看内存使用情况,确保有足够的空闲内存。

    free -h
    
1.3 磁盘性能

磁盘 I/O 是影响查询性能的关键因素。如果你的磁盘是机械硬盘(HDD),建议使用 SSD 以提高性能。

  • 监控磁盘 I/O
    使用 iostatiotop 监控磁盘 I/O 性能。

    iostat -x 1
    

2. 索引优化

2.1 索引分片和副本
  • 分片数量
    分片数量过多或过少都会影响查询性能。对于单机版,建议每个索引的分片数量不要过多,通常 1-5 个分片即可。

  • 副本数量
    副本可以提高查询吞吐量,但也会增加写入开销。对于单机版,副本数量可以设置为 0 或 1。

    修改索引的副本数量:

    PUT /your_index_name/_settings
    {
      "index": {
        "number_of_replicas": 0
      }
    }
    
2.2 索引刷新间隔

默认情况下,Elasticsearch 每 1 秒刷新一次索引,这会导致频繁的 I/O 操作。你可以适当延长刷新间隔以减少 I/O 开销。

  • 修改刷新间隔

    PUT /your_index_name/_settings
    {
      "index": {
        "refresh_interval": "30s"
      }
    }
    
2.3 索引分片分配

确保索引分片均匀分布在节点上。对于单机版,分片分配通常不会有问题,但可以通过以下命令检查分片分配情况:

GET /_cat/shards?v

3. 查询优化

3.1 查询语句优化
  • 避免使用通配符查询
    通配符查询(如 *)会导致全表扫描,性能较差。尽量使用精确匹配或范围查询。

  • 使用过滤器
    过滤器(Filter)比查询(Query)更高效,因为它不会计算得分,且可以缓存结果。

    示例:

    GET /your_index_name/_search
    {
      "query": {
        "bool": {
          "filter": [
            { "term": { "status": "active" } }
          ]
        }
      }
    }
    
  • 分页查询优化
    避免使用深分页(如 fromsize),深分页会导致大量数据加载,性能较差。可以使用 search_afterscroll 来优化分页查询。

3.2 缓存

Elasticsearch 提供了多种缓存机制,如过滤器缓存、字段数据缓存等。确保这些缓存被充分利用。

  • 启用过滤器缓存
    默认情况下,过滤器缓存是启用的。你可以通过以下命令查看缓存使用情况:

    GET /_nodes/stats/indices/query_cache
    
3.3 查询限流

如果查询过于频繁,可能会导致系统负载过高。可以通过设置查询限流来控制查询的并发数。

  • 设置查询限流

    PUT /_cluster/settings
    {
      "persistent": {
        "indices.query.bool.max_clause_count": 1024
      }
    }
    

4. 集群配置优化

4.1 线程池配置

Elasticsearch 使用多个线程池来处理不同的任务。你可以根据系统资源调整线程池的大小。

  • 修改线程池配置

    PUT /_cluster/settings
    {
      "persistent": {
        "thread_pool.search.size": 10,
        "thread_pool.search.queue_size": 1000
      }
    }
    
4.2 垃圾回收(GC)优化

Elasticsearch 使用 JVM 的垃圾回收机制,GC 的性能直接影响查询性能。建议使用 G1GC 垃圾回收器。

  • 启用 G1GC

    编辑 jvm.options 文件,启用 G1GC:

    -XX:+UseG1GC
    

5. 监控和调优

5.1 使用 Kibana 监控

Kibana 提供了丰富的监控工具,可以帮助你分析查询性能和系统资源使用情况。

  • 安装 Kibana
    如果你还没有安装 Kibana,可以通过以下命令安装:

    docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.16
    
  • 查看监控面板
    在 Kibana 中,进入 “Stack Monitoring” 面板,查看 Elasticsearch 的性能指标。

5.2 使用慢查询日志

启用慢查询日志,可以帮助你定位查询性能瓶颈。

  • 启用慢查询日志

    PUT /your_index_name/_settings
    {
      "index.search.slowlog.threshold.query.warn": "10s",
      "index.search.slowlog.threshold.query.info": "5s",
      "index.search.slowlog.threshold.query.debug": "2s",
      "index.search.slowlog.threshold.query.trace": "500ms",
      "index.search.slowlog.threshold.fetch.warn": "1s",
      "index.search.slowlog.threshold.fetch.info": "800ms",
      "index.search.slowlog.threshold.fetch.debug": "500ms",
      "index.search.slowlog.threshold.fetch.trace": "200ms"
    }
    

6. 总结

通过以上优化步骤,你可以显著提升 Elasticsearch 的查询性能。具体优化措施包括:

  • 硬件优化:增加内存、使用 SSD、优化文件系统缓存。
  • 索引优化:合理设置分片和副本、调整刷新间隔、优化分片分配。
  • 查询优化:优化查询语句、使用过滤器、启用缓存、避免深分页。
  • 集群配置优化:调整线程池、启用 G1GC、设置查询限流。
  • 监控和调优:使用 Kibana 监控、启用慢查询日志。

http://www.kler.cn/a/451393.html

相关文章:

  • Kubernetes、Docker 和 Docker Registry 关系是是什么?
  • 39.在 Vue3 中使用 OpenLayers 导出 GeoJSON 文件及详解 GEOJSON 格式
  • 详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)
  • Mac系统下 IDEA配置Maven本地仓库
  • Datawhale AI 冬令营学习笔记-零编程基础制作井字棋小游戏
  • WWW23-多行为级联|级联图卷积网络的多行为推荐
  • Stable-diffusion-WebUI 的API调用(内含文生图和图生图实例)
  • DocFlow票据AI自动化处理工具,提升企业票据数字化管理效能
  • mybatis框架——缓存,分页
  • 【c++高阶DS】图
  • node.js的异步工作之---回调函数与回调地狱
  • 用Python在Excel工作表中创建、修改及删除表格区域
  • C#(事件)2
  • 第79期 | GPTSecurity周报
  • 《智启新材:人工智能重塑分子结构设计蓝图》
  • Krita安装krita-ai-diffusion工具搭建comfyui报错没有ComfyUI_IPAdapter_plus解决办法
  • [Vim][常用操作整理]详细讲解
  • 音视频学习(二十七):SRT协议
  • Excel 列名称转换问题 Swift 解答
  • LeetCode 343.整数拆分
  • #渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍11基于XML的SQL注入(XML-Based SQL Injection)
  • 考前96天 学习巩固 计算机、数学、英语
  • leetcode 3132. 找出与数组相加的整数 II 中等
  • MySQL追梦旅途之慢查询分析工具mysqldumpslow和pt-query-digest
  • Maximum Crossings (Hard Version)最大交叉次数(困难版本)
  • ROS1入门教程5:简单行为处理