索引选择性 = 索引列的唯一值数量 / 表中的总行数
批量问题
批处理默认是逐条发送 SQL 到数据库的,没有充分利用数据库提供的原生批处理能力,需要额外的配置来启用真正的批处理支持,如使用ExecutorType.BATCH
自定义injector 或者 mapper里面自己写sql
执行过程
- MySQL服务器通过网络接口监听来自客户端的连接请求
- 查询解析器解析SQL语句,检查语法是否正确,生成一个内部表示结构(如解析树)
- 基本的语义检查,如验证表和列是否存在 类型是否匹配 权限
- 查询优化器会对解析树进行转换和优化,以找到执行该查询的最有效方法
优化器可能会使用批量插入优化、调整索引策略等,减少磁盘I/O和网络通信的开销
- 估不同的执行计划,(统计信息/优化规则)并选择成本最低的那个
- 分析sql要做什么 表连接过滤条件,查看物理结构 类型 约束
- 优化器多个执行路径,扫描顺序 连接方法(嵌套 哈希连接) 使用索引
- 成本估计CPU IO 内存(表行数/列值分布)
- 基于优化器决定,生成一个详细的执行计划,描述如何执行SQL语句
如何访问表、使用的索引、排序 分组 连接顺序、过滤条件等
- 开始执行批量操作,批量可能使用内存
- 批量插入,可能会使用"批量插入缓冲"技术,多个组合成一次较大的磁盘写入,减少I/O
- 批量更新或删除,按照执行计划中的步骤,逐行或逐块地处理符合条件的记录
- 管理并发访问,维护事务的一致性,确保在发生错误时能够回滚到一致的状态
隔离级别,可能会使用行锁、表锁或其他锁定机制来防止多个事务同时修改同一数据
各种并发控制策略来优化性能,例如多版本并发控制(MVCC)
记录事务日志
- 生成一个结果集,其中包含受影响的行数、错误信息(如果有)等 网络接口发送给客户端
- 释放执行该操作期间占用的所有资源,包括内存、锁等
- 不再发送其他请求,关闭连接,最小连接数可能会空闲
中间插一个事务吧 spring事务-CSDN博客 自家博客随便拿
事务隔离级别:
读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)
事务传播行为:
propagation_requires_new:开启新事物,外层和内层互不影响
propagation_required:存在则加入,否则新建
propagation_supports:存在则加入,无则无
propagation_mandatory:存在则加入,无则报错
propagation_not_supported:非事务执行,挂起事务
propagation_never:存在事务报错
propagation_nested:有则运行在一个嵌套事务中,savepoint,嵌套事务可独立当前事务单独提交/回滚,无则required算,nestedTransactionAllowed=true;外层事务失败回滚内层,内层不影响外层
MVCC
是一种用来解决读写冲突的无锁并发控制
快照读 当前读
三个隐式字段trxId事务id,rollptr回滚指针,rowid隐藏主键,undo日志read view三个组件
undolog删除:快照读或事务回滚不涉及该日志时,才会被purge线程统一清除
数据更新和删除时只设置一下老记录的deletedbit,后面由purge统一清除
修改 加上 排他锁 ,拷贝到undolog中 已经有的话 链表头部
readView 事务执行快照读 生成一个数据系统当前快照,记录并维护系统当前活跃事务id trx_list
- 被修改数据的最新纪录中的trxId,当前其他活跃事务id比较 不符合 回滚指针 比较事务id
- 事务id与uplimit id比较,是否小于 ? 是否大于等于lowlimitid,是否在trx_list中 ==》可见性
- RR级别 第一次快照读创建的
- RC每次快照读 新生成快照和readView