
数据库相关
文章平均质量分 56
数据库相关总结
想下班的猿
这个作者很懒,什么都没留下…
展开
-
mongo的tickets被耗尽导致卡顿问题
近一年来,项目线上环境的mongo数据库出现多次tickets被耗尽,导致数据库卡顿,并且都是突然出现,等待一段时间后又能自动恢复。为了解决这个问题,我们进行了长期的探索和研究,先后从多个角度进行优化,于此记录和分享一下这一路的历程。tickets是什么 为了解决这个问题,我们首先要明白ticktes是什么,其实网上基本都说的一知半解,没有一个能说明白的,但是有一个查询tieckts消耗情况的mongo命令: db.serverStatus().wiredTiger.concurr原创 2022-04-13 10:55:25 · 3147 阅读 · 0 评论 -
mongo游标使用
当我们需要读大量数据库数据进行操作时,游标经常是我们的选择之一,其原理是,首次读取数据时只会将所有项数据的index返回回来,然后再分批次读取完整的数据,这样可以避免一次性大量数据读取到服务器中,占用大量内存。同样能够避免大量数据一次性读进内存的方式还有分页查询,但是分页查询存在深翻页问题,会导致越查越慢。另一种游标式翻页(每次记录上一次查询的最后一条,并作为下一次查询的条件之一),这种唯一的缺点就是每次都需要重新做一次查询,但这个损耗也可以基本忽略,但是有一个问题就是,往往这样的条件不好找。原创 2021-10-21 18:26:44 · 663 阅读 · 0 评论 -
mongo——延长NosqlBoosterForMongo的试用期
mongo的客户端较少,其中Nosql Booster For Mongo算是一个不错的客户端软件,但是他也不是免费的,试用期只有30天。好在这个软件是基于nodejs的。所以我们可以利用npm对这个应用进行解包串改源码,将源码中设置试用期的参数改成足够大,然后再封包,这样我们就能不断的白嫖了。安装工具首先我们需要安装nodejs的一个包(当然你首先得安装nodejs和npm否则都是扯淡):npm install asar -g我这里的npm安装的工具包默认再~/.npm-global/b原创 2021-04-09 10:43:06 · 1106 阅读 · 3 评论 -
mongo——事务详解
mongo事务的本质是给自己写操作执行到的每一行记录加上一个写锁,而如果同时另一个事务也开始修改当前行时,会尝试去获取这个锁,然后阻塞规定时间,如果还没有获取到就会抛出org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 112 (WriteConflict): 'WriteConflict’的异常。而这个锁会等到事务提交,才会释放。需要注意的时,读操作是没有锁的,所以当你对原创 2021-04-08 15:05:18 · 2567 阅读 · 0 评论 -
mongo——比较两个字段是否相同
我们在sql中我们经常有这样的写法select * from table1 where table1.field1 = table1.field2查询数据库中,field1字段和field2字段相同的记录。那这种查询方式在mongo中怎么查呢:方式1:db.test.aggregate([ { $project:{ fields1: 1, fields2: 1, difference: { $e原创 2021-04-07 20:41:10 · 2746 阅读 · 0 评论 -
mongo——limit的坑
我们在mongo查询中,通过limit限制查出的条数,但是如果limit传0时,limit则默认失效了,会把整个集合中所有符合条件的数据全部给你取出来。所以在数据量大的时候,不要使用limit(0)。 看到上面的结论,可能有人就会喷了,都0了你还查个屁,怎么会有这种场景。下面是我的经历,我们的一个推荐算法中,但前一种推荐数不满足的时候,会去另外一张表里取出剩余的数量,补齐总推荐数,所以当时想当然的直接拿总数减去前一个推荐结果的数量作为limit条件(如果小于零则取0),去后一个表里去获取剩下原创 2021-02-20 18:10:52 · 1751 阅读 · 2 评论 -
mongo——拆分子节点&数据类型转换&根节点替换
拆分子节点&数据类型转换 我们知道mongo的某个元素是list,我们可以通过unwind把每个子元素拆解出来,然后再通过group可以很方便的对原本的list进行一个聚合操作,但是如果我们的元素的子节点是还是多个普通元素呢,就不能直接 通过unwind将每个子节点进行拆分。这个时候我们需要通过$objectToArray方法,将多个子节点转换成多个list元素,eg:db.finance_pay_daily.aggregate() .match({time:{$gte:ISODa原创 2021-02-20 17:25:58 · 381 阅读 · 0 评论 -
mysql优化整理
最近做系统优化,涉及到数据的优化内容较多,做一个统一的整理,后续有新的持续更新:表锁:mysql在使用for update行级锁和update语句时,如果没有触发索引会导致表锁从而导致性能降低甚至数据源被爆掉。所以where的条件必须命中索引。大数据量模糊查询的时候不要使用前置模糊查询,类似这样:where col_field like %aaa%,因为%在前的模糊查询无法命中...原创 2020-04-14 19:46:40 · 116 阅读 · 0 评论 -
mysql与oracle的常见区别整理
最近公司项目都在做云上迁移,一个不可避免的问题就是需要把以前的oracle数据库改成rds也就是mysql,在修改过程中遇到的一些两种数据库的区别,做一个整理:描述oraclemysql获取时间sysdatenow()字符串连接‘a’||‘b’concat(‘a’,‘b’)分页双重子查询limit begin,count判空nvl(n...原创 2020-03-31 23:02:13 · 219 阅读 · 0 评论 -
从一键删除到information_schema
之前遇到这样一个问题,数据库表建错了,我又不想一个一个删,有点麻烦,所以有没有一键删除的方式,后来在网上找到了这么一句sql:SELECT CONCAT( 'drop table ', table_name, ';' )FROM information_schema.tablesWHERE table_schema='demo';执行结果:drop table test1;...原创 2020-01-19 10:57:28 · 1075 阅读 · 0 评论 -
SQL PARTITION BY
前两天看前辈们的老代码,看到了一句神奇的SQL,生平第一次见:select ……………… from (select xx1,xx2,xx3,……,row_number() over(partition by xx4,xx5 order by xx6 desc,xx7 desc) rownum from xxxx_tbl where xxx8='sdfdsf' ……)whe...原创 2019-12-16 13:28:16 · 2337 阅读 · 0 评论 -
mysql order by+limit数据重复问题
前段时间遇到一个问题mysql查询问题,当我们使用select * from xxxx_tbl order by col1 limit 0,5 时,如果col1在表中存在重复,那么我们通过limit分页查出来的数据就可能存在不全,或者重复。案例表结构如下:字段类型注释idvarchar(20)主键col1varchar(20)col1col2...原创 2019-12-12 20:27:09 · 1205 阅读 · 0 评论 -
PL SQL Developer中文乱码
oracle数据库客户端PL SQL Developer出现中文乱码解决方法:进入客户端,执行sql:select * from nls_database_parameters where parameter ='NLS_CHARACTERSET’查询出数据库的编码格式,我这里查询出来为ZHS16GBK,然后在环境变量设置界面,添加系统环境变量,变量名为NLS_LANG,值为:AMERICAN_AMERICA.ZHS16GBK。(值得后半部分即为数据库的编码格式)...原创 2020-07-17 23:47:18 · 149 阅读 · 0 评论 -
mongo——各种数据原子插入方式
与mysql的insert不同,mongo在数据插入方面有多种方式,这里进行统一的总结一下:insert 和mysql一样,mongo也支持insert这种直接插入,当插入出现唯一键冲突时则会失败,抛出异常:db.test.insert({ "name":"1223"})save save是基于主键的文档替换,如果主键存在则其他字段完全替换成新的字段,如果老的字段,新的文档中不存在,则删除了,如果主键原本不存在,这插入一条新的文档。可能会觉得这种方式挺好的,不会出现原创 2021-01-12 13:40:56 · 728 阅读 · 0 评论 -
mongo文档子列表元素查询
由于mongo是一个树状结构数据存储,所以我们往往需要基于子文档去查询某个东西,比如数据如下:{ "_id" : "97d73f8dd62a4c659c37335e321b8cc8", "end_time" : ISODate("2020-12-01T00:00:00.000+08:00"), "start_time" : ISODate("2020-11-01T14:00:00.000+08:00"), "week_cfg" : [ NumberInt(0), NumberInt原创 2020-11-03 15:40:30 · 811 阅读 · 0 评论 -
spring——基于mongo的二维索引实现附近的人
最近我们项目中增加了附近的人功能,如果单从实现上考虑其实没有什么难度,采集用户的经纬度坐标,然后用户调用接口去查询附近的人,根据用户的当前坐标去db里一个一个算距离,如果我们用户数就几十几百个,可能每次调接口的时候去算,也能够接受,但是如果你有几百万甚至上亿用户,用户每次来获取附近的人,你就把所有的人的坐标和当前距离算一遍,再排个序,肯定炸了。经过研究发现,现有的一些app,比如微信,陌陌等都是有附近的人这个功能的,而这种空间距离计算,其实都是基于geohash这个算法。 我们都知道在一位数原创 2020-11-02 20:03:12 · 327 阅读 · 0 评论 -
spring——基于mongolist元素实现固定大小队列
最近手上有一个需求,需要记录任意两人的会话,并且需要记录最近N条聊天记录。我们首先可以想到一个表记录所有人的聊天记录:发送方,接收方,发送内容,时间。然后一个表记录会话,用户1,用户2,最新的会话时间。然后根据会话表查询聊天记录表获取两人之间的按时间倒序的聊天内容。但是如果最近的N条聊天记录要同会话列表有一同展示就有点头秃了。如果查到一个会话列表,然后遍历去查每个会话的前N条聊天记录。那假设每查一次200ms(因为聊天记录表是庞大的,就算加上了索引,也在几百毫秒的性能损耗),那如果一个列表50条数据原创 2020-10-14 11:12:33 · 249 阅读 · 0 评论 -
docker创建mongo容器并设置mongo权限
docker 创建运行mongo容器,并进入到容器内部$ docker run -itd --name mongo -p 27017:27017 mongo --auth$ docker exec -it mongo mongo admin创建用户创建所有数据库管理用户db.createUser({ user: "useradmin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] }原创 2020-09-24 11:27:27 · 1253 阅读 · 1 评论 -
mongo唯一键冲突造成事务破坏
先上代码 @Transactional fun bindParentQd(childQdName: String, parentQdId: String) { try { //插入子渠道表 qdDao.insertChildQd(childQdName, parentQdId) } catch (e: DuplicateKeyException) { //插入冲突,说明有人插入过了,进行更原创 2020-08-26 19:36:59 · 3485 阅读 · 0 评论 -
mongo聚合指令
为了便于做复杂的聚合查询,mongo提供了aggregate指令,基于管道运算进行对数据的处理,常见的$sort,$project,$group,$match就不在赘述了,下面整理一些不常见的但是有时候很有用的指令:$unwind我们插入mongo数据的时候,肯定会遇到插入数组或者列表的场景,但是对于列表数据的读取怎么操作呢,比如我想把多条文档中的列表数据重新整合去重该怎么操作,这是就需要用到unwind,它可以将某一个列表打散拆成多条文档:{"id":1,list:[1,2,3,4]}{"原创 2020-08-25 18:26:23 · 387 阅读 · 0 评论