22.redolog 是怎么记录日志的? 23.redolog 和 binlog 的区别是什么? 24.说一说 mvcc 吧,有什么作用? 25.一条 Sql 语句查询一直慢会是什么原因?...想想,如果没有目录会怎么样,最差的结果是你有可能翻到字典的最后一页才找到你想要找的字。 索引就「相当于我们字典中的目录」,可以极大的提高我们在数据库的查询效率。 8.索引失效的场景有哪些?...而且在数据库中基于范围的查询是非常频繁的,效率更高。 10.WAl 是什么?有什么好处?...假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现「好像刚刚的更改对于某些数据未起作用」,但其实是事务...25.一条 Sql 语句查询一直慢会是什么原因?
这个算法的原理是把更多的历史记录考虑进来。简单LRU(也就是 LRU-1),只考虑最后一次使用的数据。...由于检查循环是昂贵的(所有锁组成的图表是很庞大的),经常会通过简单的途径解决:使用超时设定。如果一个锁在超时时间内没有加上,那事务就进入死锁状态。...2) Redo阶段:这一关从分析中选中的一条日志记录开始,使用 REDO 来将数据库恢复到崩溃之前的状态。 在REDO阶段,REDO日志按照时间顺序处理(使用LSN)。...3) Undo阶段:这一阶段回滚所有崩溃时未完成的事务。回滚从每个事务的最后一条日志开始,并且按照时间倒序处理UNDO日志(使用日志记录的PrevLSN)。...对于哪些需要 REDO 哪些需要 UNDO 的信息在 2 个内存表中: 事务表(保存当前所有事务的状态) 脏页表(保存哪些数据需要写入磁盘) 当新的事务产生时,这两个表由缓存管理器和事务管理器更新。
2、内连接 基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段; 从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留结果...其中 union 选项有 2 个。ALL:保留所有;Distinct(默认):去重。 应用:查询同一张表,但是有不同的需求;查询多张表,多张表的结构完全一致,保存的数据也是一样的。...在联合查询中,order by 不能直接使用。需要对查询语句使用括号才行。另外需要配合 limit 使用。 5、索引 如果说数据库表中的数据是一本书,那么索引就是书的目录。...2、事务的 ACID 是什么?事务并发会产生哪些问题? 3、数据库性能优化有哪些方式? 9、数据库笔试题 (1)用一条 SQL 语句查询出每门课都大于 80 分的学生姓名 ?...① 查询起飞城市是北京的所有航班,按到达城市的名字排序 ② 查询北京到上海的所有航班记录(起飞城市,到达城市,起飞时间,航班号) ③ 查询具体某一天(2005-5-8)的北京到上海的的航班次数
对于这个问题的改进很简单,直接把所有分配到的借款人直接一次锁住就行了。...案例二 在开发中,经常会做这类的判断需求:根据字段值查询(有索引),如果不存在,则插入;否则更新。...但是,删除状态的记录会在索引中存放一段时间。) 在RR隔离级别下,唯一索引上满足查询条件,但是却是删除记录,如何加锁?...因此,为了修改一条记录,InnoDB内部如何处理:根据给定的查询条件,找到对应的记录所在页面; 对页面加上X锁(RWLock),然后在页面内寻找满足条件的记录; 在持有页面锁的情况下,对满足条件的记录加事务锁...此时,行锁获取没有任何锁保护,因此加上行锁之后,记录可能已经被并发修改。因此,此时要重新加回页面锁,重新判断记录的状态,重新在页面锁的保护下,对记录加锁。
,也支持表级锁 二 数据库事务的四大特性ACID 原子性(Atomic) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态...如果此时又有一个事务对该记录进行了修改,则undo log日志中又会增加一条日志。 这样就是快照读版本的实现了。...这是因为比如A事务需要修改操作所有记录,此时B事务使用主键索引id来进行where条件查询来进行删除操作,此时只需要锁住where命中的id记录即可,那么就能防止事务A出现幻读现象。...例子1:比如现在事务A要删除一条不存在的id为7的记录,此时事务B要新增一条id为8的记录,会发现事务B一直 处于等待中,这是因为精准查询全部都不命中,会对该记录范围加Gap锁。...在RR隔离级别下,如果删、改、查语句的where条件走的是主键索引或者唯一索引 i. where条件全部命中,则给该记录加上记录锁。
,这也是我们使用最多的触发器,在配置文件中做如下配置,即可在qrtz_cron_triggers生成记录: ?...相同的trigger和task,每触发一次都会创建一个实例;从刚被创建的ACQUIRED状态,到EXECUTING状态,最后执行完从数据库中删除; 6.qrtz_triggers 存储定义的trigger...和qrtz_fired_triggers存放的不一样,不管trigger触发了多少次都只有一条记录,TRIGGER_STATE用来标识当前trigger的状态;firstCalendarTask每天执行一次...查询保存在数据中的CronCalendar: ?...记录了最后最新的检查时间,在quartz.properties中设置了CHECKIN_INTERVAL为1000,也就是每秒检查一次; 11.qrtz_locks Quartz提供的锁表,为多个节点调度提供分布式锁
意思就是说MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新语句(增删改操作)前,会自动给涉及的表加写锁,这个过程并不需要用户干预。 ...MDL锁:在事务中,InnoDB会给涉及的所有表加上一个MDL锁,其他事务就不可以执行任何DDL语句的操作。...(亲测只要在事务中,不管是查询语句还是更新语句,涉及到的表都会被加上MDL锁) 这三种锁,是InnoDB内部使用的锁,是自动实现的,不需要用户干预。...next-key锁(记录所和间隙锁的组合) 当InnoDB扫描索引记录时,会先对选中的索引记录加上记录锁(record Lock),再对索引记录两遍的间隙加上间隙锁(gap lock)。 ...事务中混合使用存储引擎会怎样? MySQL的服务层不管理事务,事务是由下层的存储引擎实现的(表锁是由MySQL的服务层实现的),所以在同一个事务中,使用多种存储引擎的表是有风险的。
也就是说在一个事务中,不管有多少条增删改,都是在加锁阶段加锁,在 commit 后,进入解锁阶段,才会全部解锁。...前提五:SQL执行计划是什么?索引扫描?还是全表扫描 根据上面的前提条件,可以有九种组合,当然还没有列举完全。...与组合er的唯一区别,组合二最多只有一个满足条件的记录,而在组合三中会将所有满足条件的记录全部加上锁。 结论:若id列上有非唯一索引,那么对应的所有满足SQL查询条件的记录,都会加上锁。...一个等值查询,最多只能返回一条满足条件的记录,而且新的相同取值的记录是无法插入的。...直至第一条出现不满足条件的记录,此时,不需要给记录加上X锁,但是需要给Gap加上Gap锁吗,最后返回结果。
通过 channel 的名字获取相应的 Reader 和最后一条 msg 判断是否有 Reader,如果没有提示这个channel 没有注册,并返回 通过 reader 判断时延,如果小于0或者大于则设置状态为...通过 MonitorManager 去创建不同的 Reader,然后开始观测,并获取这个 channel 最后一次信息,然后保存下来并返回。...这个逻辑就是一个 LatencyRecordMap 中有一组 LatencyRecord,获取第一条记录中的开始时间,获取最后一条的结束时间。...是从点云信息到各个模块输出的时间,也就是端到端时间。 这里有个重要的变量kE2EStartPoint 。 它是什么呢?其实是一条字符串,它被赋值为FLAGS_pointcloud_topic。...也就是: E2E Latency 的逻辑: 记录第一条点云数据的开始时间 依次记录那些不是点云数据的记录的开始时间,计算它们之间的差值,就成了这一个测试周期的 E2E 时延。
背景 在一年前我写过一篇关于分布式事务的文章: 再有人问你分布式事务,把这篇扔给他,在这篇文章中我详细介绍了分布式事务是什么,实现分布式事务有哪些常用的方案,但是其中的东西很多是偏于理论,很多读者对其真正在实战上的使用可能还是有点差距...3:支付券 Step 4:支付金币 Step 5:更新订单状态为已完成 差不多这里就是简简单单4行,有很多人会把这5步直接放进事务之中,也就是加上@Transactional注解,但其实加上这个注解不仅没有起到事务作用...有了这个重做记录之后我们只需要在每一次执行记录下我们的当前资源的transaction_record,在回滚的时候根据我们的OrderId将所有的资源回滚,我们优化之后代码可以如下: int...我们在分布式任务的逻辑中每次查询我们的处于订单状态为init 并且 创建时间超过一分钟的订单,我们对其进行回滚,回滚完成之后将订单状态置为FAILED。...所以幂等在我们重试的时候非常重要,实现幂等的关键是什么?我们想让多次操作和一次操作是一样的,那么我们只需要比较第一次已经做过了,而这个标记通过什么来完成呢?
本文参考了极客时间里林晓斌老师的【MySQL实战45讲】 一、一条查询语句的执行流程 1.MySQL逻辑架构 image.png Server层包含MySQL的大多数核心服务,和所有内置函数,所有跨存储引擎功能的实现...) 1.redo log模块 先分析问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高 这时候就需要redo log了,当有一条记录需要更新的时候...,binlog也还没有记录,所以不会影响 redo log已经有了commit标识,则直接提交事务,同时因为binlog有记录,则恢复数据也不受影响 三、事务隔离 在MySQL中,事务是在引擎层实现的,...最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读 不可重复读 在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。...所以从A的角度看,V1、V2值是1,V3的值是2 4.事务隔离的实现 以可重复读为例,在MySQL中,每条记录在更新的时候都会同时记录一条回滚操作。
数据库隔离级别有四种,应用《高性能mysql》一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED...,B,在A中修改事务隔离级别,在B中开启事务并修改数据,然后在A中的事务查看B的事务修改效果: 1.READ-UNCOMMITTED(读取未提交内容)级别 1)A修改事务级别并开始事务,对user表做一次查询...2)B更新一条记录 3)此时B事务还未提交,A在事务内做一次查询,发现查询结果已经改变 4)B进行事务回滚 5)A再做一次查询,查询结果又变回去了 6)A表对user表数据进行修改 7)B表重新开始事务后...在事务中对某条记录修改,会对记录加上行共享锁,直到事务结束才会释放。...B的修改处于等待状态,等待A事务结束,最后超时,说明A在对user表做查询操作后,对表加上了共享锁 SERIALIZABLE事务隔离级别最严厉,在进行查询时就会对表或行加上共享锁,其他事务对该表将只能进行读操作
此时,在事务B中使用 select 语句进行查询,我们发现在事务A提交之前,事务B中查询到的记录 age 一直是1,直到事务A提交,此时在事务B中 select 查询,发现 age 的值已经是 10 了...这就出现了一个问题,在同一事务中(本例中的事务B),事务的不同时刻同样的查询条件,查询出来的记录内容是不一样的,事务A的提交影响了事务B的查询结果,这就是不可重复读,也就是读提交隔离级别。 ?...还是要强调,两者主要的区别就是在快照的创建上,可重复读仅在事务开始是创建一次,而读提交每次执行语句的时候都要重新创建一次。 并发写问题 存在这的情况,两个事务,对同一条数据做修改。...MySQL 会为这张表中所有行加行锁,没错,是所有行。但是呢,在加上行锁后,MySQL 会进行一遍过滤,发现不满足的行就释放锁,最终只留下符合条件的行。...这是有索引的情况,如果 age 不是索引列,那么数据库会为整个表加上间隙锁。所以,如果是没有索引的话,不管 age 是否大于等于30,都要等待事务A提交才可以成功插入。
对于这个问题的改进很简单,直接把所有分配到的借款人直接一次锁住就行了。...案例二 在开发中,经常会做这类的判断需求:根据字段值查询(有索引),如果不存在,则插入;否则更新。...(注:这些标识为删除状态的记录,后续会由后台的Purge操作进行回收,物理删除。但是,删除状态的记录会在索引中存放一段时间。) 在RR隔离级别下,唯一索引上满足查询条件,但是却是删除记录,如何加锁?...因此,为了修改一条记录,InnoDB内部如何处理: 根据给定的查询条件,找到对应的记录所在页面; 对页面加上X锁(RWLock),然后在页面内寻找满足条件的记录; 在持有页面锁的情况下,对满足条件的记录加事务锁...此时,行锁获取没有任何锁保护,因此加上行锁之后,记录可能已经被并发修改。因此,此时要重新加回页面锁,重新判断记录的状态,重新在页面锁的保护下,对记录加锁。
我有一个在携程网工作的DBA朋友,他说“如果那里的数据出了问题,停机维护成本还是挺大的,因为好多人都用携程app来买机票跟酒店” 他以前跟我说过一次,携程网停机一小时损失差不多是在一两百万的情形,如果业务系统停机还好说...具体的执行时这样的: 平时我们数据库在执行SQL语句的时候是这样的,这些操作记录在binlog日志里面,恢复数据的时候,你们编写程序提取binlog日志里面的内容然后逐条分析,看看是那一条sql语句导致的误删除...LIMIT 1000,20 ; 我想从1000条数据中取20条记录,这个语句就写成了limit 1000,20 ,那这条sql执行的时候,数据库可要从第一条计数,数到1000条的时候,开始往后查询20条数据...,当然我现在要想查询10万条以后的数据, 数据库就得从头计数,从第一条数到10万条记录,然后再往后查询你想要的数据,越是数据越多,这个limit后面你所要查询的就越慢,所以我们要像一个办法去解决分页查询的问题...当然了,在一些必须要物理删除的情形下,还是有折中的加速分页查询的方法 什么样的数据不适合物理删除 核心业务表的数据不建议做物理删除,因为物理删除后,真的就只能停机恢复数据,这个代价真的非常大,反之我们可以对需要删除的记录做状态上的变更
对于这个问题的改进很简单,直接把所有分配到的借款人直接一次锁住就行了。...案例二 在开发中,经常会做这类的判断需求:根据字段值查询(有索引),如果不存在,则插入;否则更新。...(注:这些标识为删除状态的记录,后续会由后台的 Purge 操作进行回收,物理删除。但是,删除状态的记录会在索引中存放一段时间。)...因此,为了修改一条记录,InnoDB 内部如何处理: 根据给定的查询条件,找到对应的记录所在页面; 对页面加上 X 锁 (RWLock),然后在页面内寻找满足条件的记录; 在持有页面锁的情况下,对满足条件的记录加事务锁...此时,行锁获取没有任何锁保护,因此加上行锁之后,记录可能已经被并发修改。因此,此时要重新加回页面锁,重新判断记录的状态,重新在页面锁的保护下,对记录加锁。
也就是说在一个事务中,不管有多少条增删改,都是在加锁阶段加锁,在 commit 后,进入解锁阶段,才会全部解锁。...5、SQL执行计划是什么?索引扫描?还是全表扫描 根据上面的前提条件,可以有九种组合,当然还没有列举完全。...与组合er的唯一区别,组合二最多只有一个满足条件的记录,而在组合三中会将所有满足条件的记录全部加上锁。 结论:若id列上有非唯一索引,那么对应的所有满足SQL查询条件的记录,都会加上锁。...一个等值查询,最多只能返回一条满足条件的记录,而且新的相同取值的记录是无法插入的。...直至第一条出现不满足条件的记录,此时,不需要给记录加上X锁,但是需要给Gap加上Gap锁吗,最后返回结果。
对于这个问题的改进很简单,直接把所有分配到的借款人直接一次锁住就行了。...案例二 在开发中,经常会做这类的判断需求:根据字段值查询(有索引),如果不存在,则插入;否则更新。...但是,删除状态的记录会在索引中存放一段时间。) 在RR隔离级别下,唯一索引上满足查询条件,但是却是删除记录,如何加锁?...因此,为了修改一条记录,InnoDB内部如何处理: 根据给定的查询条件,找到对应的记录所在页面; 对页面加上X锁(RWLock),然后在页面内寻找满足条件的记录; 在持有页面锁的情况下,对满足条件的记录加事务锁...此时,行锁获取没有任何锁保护,因此加上行锁之后,记录可能已经被并发修改。因此,此时要重新加回页面锁,重新判断记录的状态,重新在页面锁的保护下,对记录加锁。
领取专属 10元无门槛券
手把手带您无忧上云