elasticsearch的查询方式和mysql数据库事务隔离级别的思考

这篇具有很好参考价值的文章主要介绍了elasticsearch的查询方式和mysql数据库事务隔离级别的思考。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

普通分页

解除查询限制

scroll查询

search_after

官方改进

轻量级试图(pit,Point in time)

总结


项目中用到了 elasticsearch,发现有几种查询方式不太一样,思考了一下,总结如下

普通分页

等同于关系数据库的分页查询,例如 mysql 的 limit,如下 sql

select * from test limit 100000,10

这种查询方式有一个问题,需要查询 1000010 条数据到内存中,然后筛选出最后的 10 条数据进行返回,这样就会造成一个问题,对内存大大浪费。

对于 elasticsearch 也是这样,所以针对分页数量大于 10000 的数据做了限制,需要手动开启参数 track_total_hits 为 true 才行,如果这样做了会产生一个问题,就是大量数据加载 jvm 中(elasticsearch使用java开发,使用的lucene也是),内存吃紧开销大,造成频繁的 gc。

解除查询限制

PUT _all/_settings
{
  "index" : {"max_result_window" : 1000000}
}

这种方式是治标不治本,不建议修改

需要确保如下要求

from + size < max_result_window

为了解决这个深分页的问题,滚动查询出现了

scroll查询

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-scroll.html

从 5.0 版本开始添加。

scroll API 可用于从单个搜索请求检索大量结果(甚至所有结果),这与在传统数据库上使用游标的方式大致相同。
scroll 并不是为了实时用户请求,而是为了处理大量数据,只能往下查询。

通过第一次查询后返回一个scroll id,往后每次查询都基于这个scroll id,直到查询不到数据为止。

开始查询时形成一个快照,连续查询过程中,不会将新增加或修改的数据添加到查询结果中,也不支持跳页查询。

初始化时将所有符合搜索条件的搜索结果缓存起来,可以想象成快照,在遍历时,从这个快照里取数据,也就是说,在初始化后对索引插入、删除、更新数据都不会影响遍历结果。

如果想要在查询过程中某些数据修改了,需要查询到最新的数据。需要使用 search_after 来实现。

类似于mysql事务隔离级别中的 REPEATABLE READ,每个事务只会在第一次执行查询语句时生成一个 ReadView,即数据修改了不影响本次查询的结果。

search_after

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-search-after.html

和 scroll 查询一样,从 5.0 版本开始添加。使用的场景不同。

search_after不是自由跳转到随机页面的解决方案,而是并行滚动许多查询的解决方案。

它与 API 非常相似,与 scroll 不同的是,search_after参数是无状态的,它总是根据搜索器的最新版本进行解析。因此,排序顺序可能会在步行过程中发生变化,具体取决于索引的更新和删除。

在查询过程中至少指定一个唯一不重复字段来排序。

类似于mysql事务隔离级别中的 READ COMMITTED,每个事务在每次查询开始时都会生成一个独立的 ReadView,即数据修改了每次执行查询了数据都是不同的。

官方改进

轻量级试图(pit,Point in time)

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/point-in-time-api.html

从 7.10 版本中开始添加。

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/scroll-api.html

在这个文档上,指出了不推荐使用 scroll 查询,使用 search_after 和 pit 来代替。即针对快照数据建议使用这种方式。

elasticsearch的查询方式和mysql数据库事务隔离级别的思考,elasticsearch,mysql,事务,elasticsearch,mysql,大数据,搜索引擎,jvm,java

对于search_after 和 pit 结合使用与 scroll 的到底有什么区别,官方文档也没做说明,也没找到对应的性能对比测试。

总结

查询方式 数据量 实时查询 排序 跳页 使用场景 与mysql数据库事务隔离级别对应关系
from+size浅分页 <=10000 支持 支持 支持 实时跳页查询,搜索引擎 READ COMMITTED
scroll >10000 不支持 支持 不支持 深分页,无序批量查询.。
后台批处理、导出
REPEATABLE READ
search_after >10000 支持 支持 不支持 深分页,实时大批量查询 READ COMMITTED

参考链接

https://blog.csdn.net/liaomingwu/article/details/117323936

https://blog.csdn.net/weixin_46097842/article/details/107889284

https://cloud.tencent.com/developer/article/1825190

https://juejin.cn/post/7088110134076899365

https://blog.csdn.net/UbuntuTouch/article/details/119926953

 文章来源地址https://www.toymoban.com/news/detail-801126.html

到了这里,关于elasticsearch的查询方式和mysql数据库事务隔离级别的思考的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • mysql数据库之事务

    mysql数据库之事务

    总的来说,事务 就是一种机制,包含了一组操作命令,会作为一个不可分割的整体,要么都执行,要么都不执行 ,它保证了数据库的安全可靠性 是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这

    2024年02月09日
    浏览(8)
  • Sql Server 数据库事务与锁,同一事务更新又查询锁的变化,期望大家来解惑!

    Sql Server 数据库事务与锁,同一事务更新又查询锁的变化,期望大家来解惑!

    我有一个People表,有三行数据: 如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作。 我们知道sql server数据库的默认事务级别是READ COMMITTED(已提交的读取),我们再看一下已提交读事

    2024年02月01日
    浏览(32)
  • 简单认识MySQL数据库事务

    简单认识MySQL数据库事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在战舰登录系统中, 要删除一艘战舰,即需要删除战舰的基本资料,又需要删除和该战舰相关的信息,如舰长, 登记船员等等。这样,这些数据库操作语句就构成一个事务! ●事务是一种机制、一个操作序列,包

    2024年02月16日
    浏览(11)
  • 【Mysql数据库 第13章】MySQL的事务、事务的隔离级别、事务的保存点

    💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇) 💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇) 💖

    2023年04月20日
    浏览(15)
  • 【MySQL数据库 | 第十五篇】事务

    【MySQL数据库 | 第十五篇】事务

        目录    前言:  介绍事务:  控制事务:  事务四大特性:  并发事务问题:  事务隔离级别: 总结:   这章我们将进入到MySQL基础篇的最后一章:事务,希望大家可以坚持下去,跟着我一起走完MySQL的学习之旅。 MySQL是一种关系型数据库管理系统,支持事务管理。 事

    2024年02月08日
    浏览(10)
  • 【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

    【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

    ⭐️ 前面的话 ⭐️ 本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍有关数据库事务的特点以及隔离级别。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由 未见花闻 原创, CSDN 首发! 📆首发时间:🌴2023年5月20日🌴 ✉️坚

    2024年02月05日
    浏览(15)
  • Spring Boot中操作数据库的几种并发事务方式

    当有多个 并发 事务时,会发生丢失更新异常。来自一个或多个 事务 的更新可能会丢失,因为其他事务会用其结果覆盖它。 让我们通过一个例子来检验一下。考虑以下执行事务的方法。 public void withdraw(Long accountId, double amount) { Account account = accountRepository.findById(accountId).orEl

    2024年01月22日
    浏览(32)
  • Go 语言实现 MySQL 数据库事务

    MySQL事务是指一组数据库操作,它们被视为一个逻辑单元,并且要么全部成功执行,要么全部回滚(撤销)。事务是数据库管理系统提供的一种机制,用于确保数据的一致性和完整性。 事务具有以下特性(通常由ACID原则定义): 原子性(Atomicity):事务中的所有操作要么全

    2024年02月08日
    浏览(12)
  • C# 从代码入门 Mysql 数据库事务

    C# 从代码入门 Mysql 数据库事务

    在业务开发中,使用数据库事务是必不可少的。而开发中往往会使用各种 ORM 执行数据库操作,简化代码复杂度,不过,由于各种 ORM 的封装特性,开发者的使用方式也不一样,开发者想要了解 ORM 对事务做了什么处理是比较难的。因此,本文介绍数据库事务基础、Ado.net 事务

    2024年02月04日
    浏览(15)
  • 初识mysql数据库之事务的概念及操作

    初识mysql数据库之事务的概念及操作

    目录 一、数据库多客户端访问问题 1. 数据库的CURD无限制带来的问题 2. 如何解决CURD导致的问题 二、事务的概念 1. 什么是事务 2. 事务的四个属性 3. mysql对事务的管理 4. 为什么会有事务 5. 事务的版本支持 三、事务的操作 1. 事务提交方式 2. 事务操作的准备工作 2.1 数据库是网

    2024年02月15日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包