Elasticsearch如何提升查询效率
分析
面试官问这个问题,一般就是向要考校你是否真的用过Elasticsearch分布式搜索引擎,对于查询效率的优化有没有真正的应用场景。
es这个东西,真正来说并没有想象中那么牛逼。很多时候数据量太大的话,特别是如果有几亿条数据,搜索效率是很低的,第一次跑的时候你会发现在5-10秒之间,至于为什么第一次跑会这么久呢,下面会给你答案。
我们要知道,对于一些现在运用的大部分主流技术,对于性能优化基本都是没有什么银弹的(指优化某一点就可以得到大的提升),不要期待随便修改一个参数配置之类的,就可以天下无敌。也许某个场景很适用,但是换个场景可能就凉凉了。
如何优化?
1、通过os cache磁盘缓存优化
当我们往es里面写数据的时候,实际上都是写到了磁盘文件中去了,而磁盘中的操作系统会自动将数据缓存到os cache中。
于是我们查询的时候就变成了这样:
- 当客户端访问es进程shard分片时,会先访问磁盘缓存区os cache
- 当磁盘缓存区检索不到数据时,再去磁盘文件中搜索
- 磁盘文件将数据返回,并且会在缓存区存储一份,所以下次查询的时候速度会非常快
- 缓存区再将数据向客户端返回
查询时候走磁盘和内存的性能差距有多大,我们测试的时候,从磁盘查询数据一般都是秒级的,1s、3s、5s都有。但是从内存os cache搜索数据的话,毫秒级绝对返回,一般就是几十毫秒到几百毫秒不等。
给大家举个例子,比如现在你有500G的es数据,都已经存在了一个主机的磁盘中,这个主机的内存区配置为32G。那你查询数据的时候内存中只存在全部数据中的%6.4,其余百分之90多都是要查询磁盘文件,那效率肯定上不去啊。
所以我们分配数据的时候,尽量把一些主要数据存在es磁盘文件中,并且数据量不要比磁盘内存去大太多。比如:es中可以存储一些关键字,名字、号码、邮箱之类的数据,拿到主数据key之后再去hbase中查询全部数据,这样一来效率就高了许多
2、缓存预热
根据es优先查询内存缓冲区的特性,我们就可以将一些热点数据提前刷到缓存中,这样用户访问的时候可以一定程度上提升效率。
比如:某个索引数据中,有10%在中午的时候属于热点数据。那么每到中午时,我可以提前在访问峰值之前,先用自己的程序搜索一下这些热点数据。保证它们存在内存缓冲区中,那是不是用户访问的这部分热点数据的时候就不用访问磁盘文件了。自然就提升了一部分效率
3、冷热分离
根据第2点,我们做了数据预热,但是其他数据并不是没有用户访问呀。当个别用户访问一些冷门数据的时候,依然会把它存在内存缓冲区,那这样一来不就把热点数据挤掉了吗。
那我们就可以根据数据的热度,将热门数据放在一个索引中,冷门数据放在另一个索引中,防止内存缓冲区中热门数据被挤掉的过多,从而影响效率。当数据做了冷热分离,那么大部分的热门数据一直存在于内存内存缓冲区,那么也能在一定程度上提升效率
4、document设计模型
我们都知道,在mysql或者oracle数据库中都有多表查询,通过某一个字段join一下另一张表,如果数据库索引用得好的话,对性能基本不会有什么影响。
但是!重点来了,es的document索引搜索的时候,最好不要这么做,es索引如果做关联查询的话是很浪费性能的。这时候就需要在设计索引的时候就将需要关联的数据放在同一个索引中,或者放在java工程中去去做关联,避免es搜索的时候做一些复杂的关联操作。虽然es是支持这个功能,但是并不提倡使用。
5、分页查询优化
es的分页性能是比较坑的,为什么呢?举个例子,当我们现在每页10条数据,当前要查询第100页,那么es的协调节点会把每一个shard的千1000条数据都拿过来,如果有5个shard,那么就会有5000条数据。再把这5000条数据排序,取990-1000条。那么这样一来页数越大,那性能肯定就越低咯。
所以这个该如何优化呢
- 一个是比较流氓的方法,你就直接告诉产品经理,尽量不要让用户翻大的页面查询,如果真的要查询,那就默认接受查询性能低下。(这时候容易和产品经理打起来)
- 另一种比较靠谱,可以通过scroll进行查询优化,但是只能让用户一页一页的往后翻,因为scroll api是通过一个游标查询去暂时记录当前获取数据的下一页,这样获取下一页的时候可以直接返回。相当于一个数据快照之类的,所损失的就是不能跳转页,只能一页一页的往后翻。当然这个scroll我们可以自己设置超时时间,一段时间不访问之后会自动释放掉。
Elasticsearch如何提升查询效率相关推荐
- 索引的使用—— 验证索引提升查询效率 || 避免索引失效 —— 全值匹配 /最左前缀法则/范围查询右边的列,不能使用索引/不要在索引列上进行运算操作/字符串不加单引号,造成索引失效
索引的使用 索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL的性能优化问题 验证索引提升查询效率 查询速度很快,接近0s ,主要的原因是因为id为主键,有索 ...
- 说明关系型数据库通过索引提升查询效率的背后原理
如果没有索引,数据库引擎需要通过全表扫描来查找数据,这会产生大量的磁盘IO. 关系型数据库使用B+树构建索引来加速加快查询.B+树是一种二叉查找树(每个节点的键值必须:比保存在左子树的任何键值都要大, ...
- MySql采用range分区可提升查询效率
简介: RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区.在5.7版本中DATE.DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的R ...
- MySQL验证索引提升查询效率
在我们准备的表结构tb_item 中, 一共存储了 300 万记录: A. 根据ID查询 select * from tb_item where id = 1999\G; 查询速度很快, 接近0s , ...
- MySQL -通过调整索引提升查询效率
我们遇到的最容易引起困惑的问题就是索引列的顺序.正确的顺序依赖于使用该索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要(顺便说明,本节内容适用于B-Tree索引:哈希或者其他类型的索引并不会 ...
- Java开发中的使用redis缓存提升查询效率
枚举类 public enum AppKey {/*** Redis Key 约定*/USER_SESSION("USER"),SYS_MENU("MENU") ...
- DB2性能优化 – 如何通过db2优化工具提升SQL查询效率
我们都知道,应用系统在运行一段时间后,用户报告系统运行会变慢,使他们不能完成所有的工作,完成事务和处理查询花费过长时间,或者应用程序在一天的某些时段变慢,要确定造成问题的本质原因,必须评估系统资源的实 ...
- mysql从innodb转到MyIsam的count查询效率极大提升
mysql从innodb转到MyIsam的count查询效率极大提升 近日,公司有个业务日志的表超过500万后,count(*)需要4分55秒,将该表的存储引擎从innodb转换到MyIsam后,查询 ...
- 改了一行代码,MySQL查询效率提升了80%,老板奖了我50万
⭐前言 优化MySQL数据库是数据库管理员必备的技能,通过不同的优化方式方法来达到提高MySQL数据库性能的目的. MySQL数据库当用户和数据量非常少的情况下,我们就很难判断MySQL数据库性能的 ...
最新文章
- 模拟 CSU 1562 Fun House
- ThreadLocal怎么实现线程隔离的?可见性问题?为什么要重新定义一个threadLocalHashCode?为什么有内存泄露?弱引用又是什么?
- python基础===将Flask用于实现Mock-server
- 安卓程序开发——创建安卓虚拟机
- org.xml.sax.SAXParseException: The string -- is not permitted within comments.
- Stopping ADB server failed(code -1)
- nodejs实践录:windows 10系统nodejs环境搭建
- 数据库:mysql内置功能-函数
- BZOJ-2257 瓶子和燃料 分解因数+数论方面乱搞(裴蜀定理)
- Illustrator 教程,如何在 Illustrator 中使用钢笔工具创建作品?
- mirdeep2使用笔记
- python 吃cpu 显卡 内存_浅析 Pycharm 内存、cpu 占用率
- 计算机启动黑屏时间很长,电脑开机黑屏时间长怎么办?[多图]
- ODC预制光纤连接器
- Java 比较图片_Java图片比对
- 聊聊RabbitMq动态监听这点事
- 详解如何使用代码进行音频合成
- nodejs生成唯一uuid
- 计算机镜像怎么恢复,利用系统映像还原Windows7系统的方法
- 【字符串2】(删除公共字符、合法括号序列判断、两种排序方法、密码强度等级)