• 关于

    数据查询系统怎么用

    的搜索结果

问题

想用mongodb存玩家数据玩家数据用的子系统的方式存的key-value,怎么查询下

珍宝珠 2019-12-01 20:00:32 10 浏览量 回答数 0

问题

express做的文章管理网站如何实现只查询一次数据库?

蛮大人123 2019-12-01 19:59:07 1209 浏览量 回答数 1

问题

目前系统用的QL SERVER2000,查询一张表800条数据要20多秒,怎么能优化数据库调用的速度

游客mxpnxp6g3cq7o 2019-12-01 19:51:54 30 浏览量 回答数 1

Quick BI 数据可视化分析平台

2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

问题

如何将NoSQL引入现有架构系统

a123456678 2019-12-01 20:13:12 914 浏览量 回答数 1

回答

我觉得有两个层面:业务层面和系统层面。业务层面我不是很好回答,因为这个业务层面肯定是跟你的业务逻辑有关系的,比如说财务系统和工作流系统,这两个数据要怎么打通?数据打通之后要支持什么样的应用?这些一定是跟你的企业的业务逻辑有强相关性的,它不是一个跟业务逻辑解耦的一件事。所以我没有办法直接说明这个在业务层面怎么操作。 但在系统层面,不根据业务逻辑,一个统一的平台一个接口层可以把一个多元异构的数据。比如说财务系统和工作流系统,甚至可以将两个底层的数据库系统都不一样,财务系统可能用的是一个OLTP的数据库MySQL或者PG,但在工作流系统用的是MongoDB一样的东西,这里面有个解决方案是说可以考虑用数据湖的概念把他们打通,也是我们的一个核心产品,也是业界现在比较火的技术。可以把传统的数据仓库像ADB它是一个云原生的数据仓库和数据湖的概念叠加在一起,可以支持多元异构的建仓然后去做查询和分析。向我们是把ADB和DLA结合起来,像的云原生数据库和云原生数据湖两者结合起来,完美的解决这个问题。DLA可以支持多元异构的数据支持和数据访问,它的特点是数据就可以待在原来的地方,这个是可以考虑的一个方向。

问问小秘 2020-05-22 11:53:09 0 浏览量 回答数 0

问题

系统偶尔出现column XX does not exist异常,需重启应用才能恢复?报错

爱吃鱼的程序员 2020-06-10 13:26:12 0 浏览量 回答数 1

回答

[健] 一个系统最基本的功能就是  登录权限 但是往往别人觉得没技术含量 其实里面学问挺大 可以贴出来一起探讨下 比如数据权限 菜单权限 登录和验证方式啥的 [犀利豆] 好巧,我之前也做个一个,我主要介绍的是技术上的一些点 「如何利用 Spring Hibernate 高级特性设计实现一个权限系统」**[元清] 树描述组织结构少不了,但是我觉得用rbac 思想指导更好[犀利豆] 主要是业务有一些要求,要根据组织架构做一些数据的隔离[元清] 嗯,数据隔离是少不了的,我是把角色作为一个租户id [犀利豆] 先有的系统,后有的权限系统,考虑了很多 接入方怎么快速接入,怎么做到无侵入[元清] 为什么要做到数据库层呢,做到数据库层已经侵入了吧,我这个就是配置一下,就可以了,配置一层filter [犀利豆] 这个的问题是比较具体的,我们的数据要按照公司的组织架构做数据隔离[元清] 都是按照组织架构做数据隔离的[犀利豆] 比如,公司分成了华南,华东,华北。三个地区的用户之间看到的信息是隔离的。[元清] 嗯,这个当然是的,用一个租户id 就可以了[犀利豆] 是的,所以这个租户id 要拼接到sql 里面,查询数据[元清] 哦,你们没有在原有表上面加字段是吧[犀利豆] 这个隔离不是全部隔离,还有横向部门的人,可以看见某几个区域的数据。[元清] 哦,你们是没有改数据库表结构,通过命名方式,来做数据查询么,比如命名规则租户id+xxxx,这个就是树形结构的描述了,我的树形是父拥有所有子的权限,我们还是侵入的,业务端的表都要加租户id 去标示[犀利豆] 没有 系统运行很长一段时间了 不太有时间改 所以想到的方法是用hibernate 的filter 在session层级做的 [元清] 可以的,hibernate我都没用过[犀利豆] 我们也要加租户id,只是已经有了。用hibernate的filter的好处只是,不需要改动controller和service层级,dao层级需要在entity 实际上配置,一个隔离租户的sql,在执行查询的时候,利用aop 把查询的session取出来,自动把过滤的条件拼接在业务sql上[元清] **听起来就很复杂,不过思路还蛮好的,应该也不难维护 来源:云原生后端社区https://www.yuque.com/server_mind/answer

montos 2020-04-20 18:27:23 0 浏览量 回答数 0

问题

一个多租户系统的数据库应该怎么设计

蛮大人123 2019-12-01 19:53:20 5476 浏览量 回答数 1

回答

怎么都说不要用MySQL来做,每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。我给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

我的中国 2019-12-02 00:31:12 0 浏览量 回答数 0

回答

怎么都说不要用MySQL来做,每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。我给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

a123456678 2019-12-02 02:50:52 0 浏览量 回答数 0

回答

怎么都说不要用MySQL来做,每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。我给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

a123456678 2019-12-02 02:52:51 0 浏览量 回答数 0

回答

方法一:不再判断,直接CREATE DATABASE IF NOT EXISTS 'db_name';。方法二:查询SHOW DATABASES LIKE 'db_name'。如果数据库不存在,则返回一个空集。不过不管怎么说,试图创建一个数据库似乎是一个不好的实践。如果普通用户可以随意增减数据库的数量,那对数据库系统的影响是灾难性的。虚拟主机商一般都不允许这么做,而是要先用控制面板去操作mysql特权用户建库,然后把现有的库授权给普通用户使用。而WP、Discuz等主流PHP程序也都不会试图创建数据库。

落地花开啦 2019-12-02 02:50:23 0 浏览量 回答数 0

问题

天眼查是怎么获得企业工商信息的?

游客bnlxddh3fwntw 2020-04-25 14:23:48 14 浏览量 回答数 1

问题

请问Delphi XE8开发FMX 的App,IOS持续使用一段时间程序被系统杀了,怎么回事?

爵霸 2019-12-01 20:15:05 1480 浏览量 回答数 1

问题

如何设计一个高并发系统?【Java问答学堂】45期

剑曼红尘 2020-06-28 20:53:14 10 浏览量 回答数 1

回答

每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

蛮大人123 2019-12-02 01:43:33 0 浏览量 回答数 0

回答

消息队列有什么优缺点 优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。 缺点有以下几个: 系统可用性降低 系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,ABCD 四个系统还好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ 一挂,整套系统崩溃,你不就完了?如何保证消息队列的高可用,可以点击这里查看。 系统复杂度提高 硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。 一致性问题 A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。 所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。但是关键时刻,用,还是得用的。 往期回顾: 【Java问答学堂】1期 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 【Java问答学堂】2期 如何保证消息队列的高可用? 【Java问答学堂】3期 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 【Java问答学堂】4期 如何保证消息的可靠性传输?(如何处理消息丢失的问题?) 【Java问答学堂】5期 如何保证消息的顺序性? 【Java问答学堂】6期 如何解决消息队列的延时以及过期失效问题? 【Java问答学堂】7期 如果让你写一个消息队列,该如何进行架构设计? 【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)? 【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊? 【Java问答学堂】10期 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 【Java问答学堂】11期 es 生产集群的部署架构是什么?每个索引的数据量大概有多少? 【Java问答学堂】12期 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 【Java问答学堂】13期 redis 和 memcached 有什么区别? 【Java问答学堂】14期 redis 都有哪些数据类型?分别在哪些场景下使用比较合适? 【Java问答学堂】15期redis 的过期策略都有哪些?内存淘汰机制都有哪些? 【Java问答学堂】16期如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍 为什么使用消息队列?【Java问答学堂】17期

剑曼红尘 2020-05-14 11:26:41 0 浏览量 回答数 0

问题

天眼查是怎么获得企业工商信息的?

游客bnlxddh3fwntw 2020-04-25 14:23:12 14 浏览量 回答数 1

问题

阿里云服务器 如何处理网站高并发流量问题?(含教程)

元芳啊 2019-12-01 21:54:35 1511 浏览量 回答数 1

问题

消息队列有什么优点和缺点?【Java问答学堂】18期

剑曼红尘 2020-05-14 11:26:31 0 浏览量 回答数 1

问题

数据库百问,教你快速上手数据库

yq传送门 2019-12-01 20:16:46 31116 浏览量 回答数 21

问题

如何设计一个轻量的用户autocomplete系统

落地花开啦 2019-12-01 20:02:02 1398 浏览量 回答数 1

问题

[精品问答]Java一百问第一期

问问小秘 2019-12-01 21:51:20 791 浏览量 回答数 1

问题

【精品锦集】中间件热门02

问问小秘 2019-12-01 19:52:34 52 浏览量 回答数 0

问题

【Java问答学堂】10期 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

剑曼红尘 2020-04-28 14:16:56 0 浏览量 回答数 1

回答

不是这样的。Collection 的单个 doc 有大小上限,现在是 16MB,这就使得你不可能把所有东西都揉到一个 collection 里。而且如果 collection 结构过于复杂,既会影响查询、更新效率,也会造成维护困难和操作风险。你有尝试过手一抖就把一个 doc 不小心存成 null 的么,反正我做过,要是一个人所有信息都在这个 collection 里面,那感觉一定相当酸爽吧。一般的原则是:•按照查询方式来聚类◦需要经常一起读取的数据放一起.◦在逻辑上关系紧密的信息放在一起。◦有 map-reduce/aggregation 需求的数据放在一起,这些操作都只能操作单个 collection。•按照数据量来拆分◦如果发现要在 collection 里面用数组,数组长度还会不断增加,那么应该把数据内容放到一个专门的 collection,每条数据都引用当前这个 doc 的主键(就像 mysql 的 1..N 外键依赖一样)。◦如果发现某个 doc 层次过深(超过 2 层),八成得考虑要拆分了,要不然性能和可维护性都会有问题。•按照有表结构的方式来设计◦MongoDB 是没有表结构这个概念的,但是实际使用的时候,很少说一个 collection 里面存在各式各样结构的 doc,如果发现 doc 的结构差别越来越大了,那么应该考虑怎么抽象成类似结构,把变化的东西扔到其他 collection 去,用外键依赖的方式互相引用。比如设计一个用户系统,user collection 应该放 name 等常用的信息,也应该放 lastLoginAt 这些仅跟 user 相关的东西,或许应该把用户有哪些访问权限的信息也放进来,但是不要放用户的登录日志这种信息会不断增加的信息。至于 user 之间的关系是否存在 user collection 则需要讨论。假如仅仅需要存储用户间的关系,记录下好友的 uid 就行,而且好友数量也不太大,几百个最多了,那么我倾向于放在一个 collection 里。如果关系数据本身就比较复杂,或者好友数会上千,那我倾向于拆分。另外,Mongodb 官方的 数据模型设计范式https://docs.mongodb.org/manual/applications/data-models/ 很值得一读,推荐去好好看看。

蛮大人123 2019-12-02 01:47:17 0 浏览量 回答数 0

回答

面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了。第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒。 你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对 es 确实玩儿的不怎么样? 面试题剖析 说实话,es 性能优化是没有什么银弹的,啥意思呢?就是不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景。也许有的场景是你换个参数,或者调整一下语法,就可以搞定,但是绝对不是所有场景都可以这样。 性能优化的杀手锏——filesystem cache 你往 es 里写的数据,实际上都写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。 es 的搜索引擎严重依赖于底层的 filesystem cache,你如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment file 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。 性能差距究竟可以有多大?我们之前很多的测试和压测,如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的,1秒、5秒、10秒。但如果是走 filesystem cache,是走纯内存的,那么一般来说性能比走磁盘要高一个数量级,基本上就是毫秒级的,从几毫秒到几百毫秒不等。 这里有个真实的案例。某个公司 es 节点有 3 台机器,每台机器看起来内存很多,64G,总内存就是 64 * 3 = 192G。每台机器给 es jvm heap 是 32G,那么剩下来留给 filesystem cache 的就是每台机器才 32G,总共集群里给 filesystem cache 的就是 32 * 3 = 96G 内存。而此时,整个磁盘上索引数据文件,在 3 台机器上一共占用了 1T 的磁盘容量,es 数据量是 1T,那么每台机器的数据量是 300G。这样性能好吗? filesystem cache 的内存才 100G,十分之一的数据可以放内存,其他的都在磁盘,然后你执行搜索操作,大部分操作都是走磁盘,性能肯定差。 归根结底,你要让 es 性能要好,最佳的情况下,就是你的机器的内存,至少可以容纳你的总数据量的一半。 根据我们自己的生产环境实践经验,最佳的情况下,是仅仅在 es 中就存少量的数据,就是你要用来搜索的那些索引,如果内存留给 filesystem cache 的是 100G,那么你就将索引数据控制在 100G 以内,这样的话,你的数据几乎全部走内存来搜索,性能非常之高,一般可以在 1 秒以内。 比如说你现在有一行数据。id,name,age .... 30 个字段。但是你现在搜索,只需要根据 id,name,age 三个字段来搜索。如果你傻乎乎往 es 里写入一行数据所有的字段,就会导致说 90% 的数据是不用来搜索的,结果硬是占据了 es 机器上的 filesystem cache 的空间,单条数据的数据量越大,就会导致 filesystem cahce 能缓存的数据就越少。其实,仅仅写入 es 中要用来检索的少数几个字段就可以了,比如说就写入 es id,name,age 三个字段,然后你可以把其他的字段数据存在 mysql/hbase 里,我们一般是建议用 es + hbase 这么一个架构。 hbase 的特点是适用于海量数据的在线存储,就是对 hbase 可以写入海量数据,但是不要做复杂的搜索,做很简单的一些根据 id 或者范围进行查询的这么一个操作就可以了。从 es 中根据 name 和 age 去搜索,拿到的结果可能就 20 个 doc id,然后根据 doc id 到 hbase 里去查询每个 doc id 对应的完整的数据,给查出来,再返回给前端。 写入 es 的数据最好小于等于,或者是略微大于 es 的 filesystem cache 的内存容量。然后你从 es 检索可能就花费 20ms,然后再根据 es 返回的 id 去 hbase 里查询,查 20 条数据,可能也就耗费个 30ms,可能你原来那么玩儿,1T 数据都放 es,会每次查询都是 5~10s,现在可能性能就会很高,每次查询就是 50ms。 数据预热 假如说,哪怕是你就按照上述的方案去做了,es 集群中每个机器写入的数据量还是超过了 filesystem cache 一倍,比如说你写入一台机器 60G 数据,结果 filesystem cache 就 30G,还是有 30G 数据留在了磁盘上。 其实可以做数据预热。 举个例子,拿微博来说,你可以把一些大V,平时看的人很多的数据,你自己提前后台搞个系统,每隔一会儿,自己的后台系统去搜索一下热数据,刷到 filesystem cache 里去,后面用户实际上来看这个热数据的时候,他们就是直接从内存里搜索了,很快。 或者是电商,你可以将平时查看最多的一些商品,比如说 iphone 8,热数据提前后台搞个程序,每隔 1 分钟自己主动访问一次,刷到 filesystem cache 里去。 对于那些你觉得比较热的、经常会有人访问的数据,最好做一个专门的缓存预热子系统,就是对热数据每隔一段时间,就提前访问一下,让数据进入 filesystem cache 里面去。这样下次别人访问的时候,性能一定会好很多。 冷热分离 es 可以做类似于 mysql 的水平拆分,就是说将大量的访问很少、频率很低的数据,单独写一个索引,然后将访问很频繁的热数据单独写一个索引。最好是将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在 filesystem os cache 里,别让冷数据给冲刷掉。 你看,假设你有 6 台机器,2 个索引,一个放冷数据,一个放热数据,每个索引 3 个 shard。3 台机器放热数据 index,另外 3 台机器放冷数据 index。然后这样的话,你大量的时间是在访问热数据 index,热数据可能就占总数据量的 10%,此时数据量很少,几乎全都保留在 filesystem cache 里面了,就可以确保热数据的访问性能是很高的。但是对于冷数据而言,是在别的 index 里的,跟热数据 index 不在相同的机器上,大家互相之间都没什么联系了。如果有人访问冷数据,可能大量数据是在磁盘上的,此时性能差点,就 10% 的人去访问冷数据,90% 的人在访问热数据,也无所谓了。 document 模型设计 对于 MySQL,我们经常有一些复杂的关联查询。在 es 里该怎么玩儿,es 里面的复杂的关联查询尽量别用,一旦用了性能一般都不太好。 最好是先在 Java 系统里就完成关联,将关联好的数据直接写入 es 中。搜索的时候,就不需要利用 es 的搜索语法来完成 join 之类的关联搜索了。 document 模型设计是非常重要的,很多操作,不要在搜索的时候才想去执行各种复杂的乱七八糟的操作。es 能支持的操作就那么多,不要考虑用 es 做一些它不好操作的事情。如果真的有那种操作,尽量在 document 模型设计的时候,写入的时候就完成。另外对于一些太复杂的操作,比如 join/nested/parent-child 搜索都要尽量避免,性能都很差的。 分页性能优化 es 的分页是较坑的,为啥呢?举个例子吧,假如你每页是 10 条数据,你现在要查询第 100 页,实际上是会把每个 shard 上存储的前 1000 条数据都查到一个协调节点上,如果你有个 5 个 shard,那么就有 5000 条数据,接着协调节点对这 5000 条数据进行一些合并、处理,再获取到最终第 100 页的 10 条数据。 分布式的,你要查第 100 页的 10 条数据,不可能说从 5 个 shard,每个 shard 就查 2 条数据,最后到协调节点合并成 10 条数据吧?你必须得从每个 shard 都查 1000 条数据过来,然后根据你的需求进行排序、筛选等等操作,最后再次分页,拿到里面第 100 页的数据。你翻页的时候,翻的越深,每个 shard 返回的数据就越多,而且协调节点处理的时间越长,非常坑爹。所以用 es 做分页的时候,你会发现越翻到后面,就越是慢。 我们之前也是遇到过这个问题,用 es 作分页,前几页就几十毫秒,翻到 10 页或者几十页的时候,基本上就要 5~10 秒才能查出来一页数据了。 有什么解决方案吗? 不允许深度分页(默认深度分页性能很差) 跟产品经理说,你系统不允许翻那么深的页,默认翻的越深,性能就越差。 类似于 app 里的推荐商品不断下拉出来一页一页的 类似于微博中,下拉刷微博,刷出来一页一页的,你可以用 scroll api,关于如何使用,自行上网搜索。 scroll 会一次性给你生成所有数据的一个快照,然后每次滑动向后翻页就是通过游标 scroll_id 移动,获取下一页下一页这样子,性能会比上面说的那种分页性能要高很多很多,基本上都是毫秒级的。 但是,唯一的一点就是,这个适合于那种类似微博下拉翻页的,不能随意跳到任何一页的场景。也就是说,你不能先进入第 10 页,然后去第 120 页,然后又回到第 58 页,不能随意乱跳页。所以现在很多产品,都是不允许你随意翻页的,app,也有一些网站,做的就是你只能往下拉,一页一页的翻。 初始化时必须指定 scroll 参数,告诉 es 要保存此次搜索的上下文多长时间。你需要确保用户不会持续不断翻页翻几个小时,否则可能因为超时而失败。 除了用 scroll api,你也可以用 search_after 来做,search_after 的思想是使用前一页的结果来帮助检索下一页的数据,显然,这种方式也不允许你随意翻页,你只能一页页往后翻。初始化时,需要使用一个唯一值的字段作为 sort 字段。 往期回顾: 【Java问答学堂】1期 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 【Java问答学堂】2期 如何保证消息队列的高可用? 【Java问答学堂】3期 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 【Java问答学堂】4期 如何保证消息的可靠性传输?(如何处理消息丢失的问题?) 【Java问答学堂】5期 如何保证消息的顺序性? 【Java问答学堂】6期 如何解决消息队列的延时以及过期失效问题? 【Java问答学堂】7期 如果让你写一个消息队列,该如何进行架构设计? 【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)? 【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?

剑曼红尘 2020-04-28 14:17:05 0 浏览量 回答数 0

问题

如何设计才可以让系统从未分库分表动态切换到分库分表上?【Java问答】42期

剑曼红尘 2020-06-22 11:05:45 34 浏览量 回答数 1

问题

ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?【Java问答学堂】28期

剑曼红尘 2020-05-28 09:45:28 15 浏览量 回答数 1

回答

如果小项目,业务逻辑和查询不是很复杂的话,直接上Spring data JPA吧,基本CRUD都提供了,稍微复杂的可以自己写JPQL。如果数据量比较大,查询逻辑也很复杂,用JdbcTemplate,方便后期维护。MyBatis还是不要用了,那玩意很烦,不如直接用JdbcTemplate。JFinal我没用过,不发表意见。######回复 @一书生 : 没有没有缺点的银弹。绝大多数OLTP系统,JPA都是合格的。如果写不好,绝大多数都是开发人员设计水平和编码水平的问题,这种情况下,换了纯JDBC有时候更糟。######回复 @魔力猫 : 其实我的意思是JPA有一定的局限性,比如我之前碰到一个问题:就是使用UNION关键字将两个结果集组装到一起的时候,Hibernate提供的JPA实现就不行了,EclipseLink的JPA实现却是可以。所以它有好的一方面就是省事,但也有一定的局限性。######OLTP查询如果非常复杂,那么表设计BUG是肯定的。######用 jdbctemplate 挺好的,就是java没有heredoc 写大段sql不方便 如果模板有一种支持动态参数的语法,其实用模板来处理sql最方便 ######@yak 可没你赚的多呀,哈哈哈######回复 @xfblue : 虚幻中的高层光明人士,请问你的脑容量多大?,这么光明的高层人士,还花工夫专门跟小杂毛较劲,你的时薪一小时多少钱?######@yak 现实中的底层阴暗人士,请问你的心理阴影多大面积的?哈哈哈,还拿分享代码跟我说事,小杂毛一枚,哈哈哈######回复 @xfblue : 心理光明的大杂种,你看,这我也会哦,没有任何技术含量,说不上谁比谁强,只能说明你逻辑比较差,这不是你个杂种的错,是根本不开逻辑课的原因,但是写代码没有逻辑就说不过去,怪不得你分享的代码为0######@yak 比你强,心理阴暗的小杂种######我自己写了个jdbctemplate拼接sql###### 引用来自“Eric_林”的评论mybatis 轻量 强烈不建议 mybatis,非常非常繁琐######回复 @繁华似水 : 正是有了属于Google的名号,各种G粉蜂拥而至.######回复 @eechen : mybatis 到真不是google的开头的,开始是ibatis,后来被谷歌收购了还是怎么得,变成google团队了。这个锅不能乱扣。######回复 @首席撸出血 : sborm,minidao 这些都是典型的基于jdbcTemplate的薄封装######给个git地址,我去学习一下,一直想用JdbcTemplate做ORM######回复 @luokery : 基于jdbcTemplate 做一个简单ORM######mybaties ######要看你系统是什么样的。建议无特别需求,OLTP系统还是用官方的标准,JPA。 ######mybatis不错######mybatis 轻量###### 引用来自“魔力猫”的评论要看你系统是什么样的。建议无特别需求,OLTP系统还是用官方的标准,JPA。 JPA+1###### 现在ORM 用的是 JPA 标准API 底层实现你可以配置任意实现JPA 标准API的框架如 Hibernate,eclipse-link,open-jpa http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html 整合他们肯定是spring-data-jpa 最方便 你只需要写接口 传@query 即可 大部分CRUD 方法他基本接口CrudRepository都自带了 spring-data-jpa 提供若干基本接口 你可以按需继承即可 http://projects.spring.io/spring-data-jpa/ 就跟当初hibernate 指定DB 方言一样 你使用JPA 标准api开发 后台orm实现配置你需要用的orm实现即可 比如这就是指定JPA 实现用的是eclipselink  <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />  从java7 开始 orm mq cache 等框架领域陆续JAVA 都在推出一系列标准API 来统一各个框架层 ###### @抢小孩糖吃 你用spring 的话可以看看 AbstractRoutingDataSource 这是SPRING 提供的路由数据源 你只需要实现具体切换数据源 设置数据源 代码即可 特别简单好用,还可以结合AOP使用######以key做搜索数据源注册名称、以value做数据源对象存放。定期扫描是否有新数据源需要注册,jdbctemplate可以直接set,拿来使用。主要我需求不同库的相同名称表是不一样的数据结构######回复 @抢小孩糖吃 : 不知道你是怎么个跨库法。######非常感谢,回去研究下。我自己写了个多数据源动态扫描,加上jdbctemplate,还是蛮好用的。当然JPA作为标准,还是需要实践的######回复 @抢小孩糖吃 : 你指的跨库是一个SQL 语句的跨库 还是若干个SQL 语句的跨库?一个SQL 语句跨库 用比如ORACLE DBLINK table@DBID 那就只能写原生SQL 语句了 JPA 支持原生SQL . 多个SQL 语句对应不同的库 用SPRING AbstractRoutingDataSource 路由 一句代码 setDbSource(dbid)即可实现DB 切换

kun坤 2020-06-15 11:08:21 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板