内容分类 | 详情 |
---|---|
Java高频面试题 | 汇总入口 |
JVM | JVM面试题 |
并发 | 并发面试题 |
Spring | Spring面试题 |
分布式 | 分布式面试题 |
SpringBoot | SpringBoot面试题 |
SpringCloud | SpringCloud面试题 |
Dubbo | Dubbo面试题 |
MySQL | MySQL面试题 |
Mybatis | Mybatis面试题 |
Redis | Redis面试题 |
RocketMQ | RocketMQ面试题 |
算法 | 算法面试题 |
遇到的问题 | 遇到的问题 |
面试官的其他问题 | 面试官的其他问题 |
Git | Git面试题 |
MySQL并发带来的问题
-
脏读:一个事务读取到另一个事务更新但还未提交的数据,如果另一个事务出现回滚或者进一步更新,则会出现问题。
-
不可重复读:在一个事务中两次读取同一个数据时,由于在两次读取之间,另一个事务修改了该数据,所以出现两次读取的结果不一致。
-
幻读:在一个事务中使用相同的 SQL 两次读取,第二次读取到了其他事务新插入的行。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(Read Uncommitted) | 有 | 有 | 有 |
读已提交(Read Committed) | 无 | 有 | 有 |
可重复读(Repeatable Read) | 无 | 无 | 有 |
串行化(Serializable) | 无 | 无 | 无 |
默认可重复读
指定事务隔离级别
@Transactional(isolation=Isolation.DEFAULT)
MySQL执行一条sql的过程
第一层客户端,主要负责与 MySQL Server 层建立连接,发送查询请求以及接受响应的结果集。
第二层是 Server 层,主要包括连接器、查询缓存、分析器、优化器、执行器等。这些组件包含了 MySQL 的大部分主要功能,例如平时使用最多的存储过程、触发器、视图都在这一层中。还有一个通用的日志模块 binlog。
第三层则是存储引擎了,主要负责数据的存储和提取。MySQL 支持多个存储引擎,例如:InnoDB、MyISAM 、Memory 等。现在最常用的存储引擎是 InnoDB,它从MySQL 5.5.5 版本开始成为了 MySQL 的默认存储引擎,重要的是 InnoDB 引擎包含了自带的日志模块 redo log,这个我们在后面会详细讲述。
通过 MySQL 的架构分层,我们可以清晰的了解到一个 SQL 大致的执行过程。
- 首先客户端发送请求到服务端,跟连接器建立连接
- 服务端先看下查询缓存是否命中,命中就直接返回,否则继续往下执行。
- 接着来到分析器,进行词法分析、语法分析,一些系统关键字校验,校验语法是否合规等等。
- 然后优化器进行 SQL 优化,比如怎么选择索引之类,然后生成执行计划。
- 最后执行器调用存储引擎 API 查询数据,返回结果。
大数据量的情况下如何添加字段
方法一:
- 添加临时表,把旧表的数据复制过来,把临时表的名称改为旧表的名称。
- 检查表数据是否一致,如果存在有新数据,就把新数据同步到新表中。
方法二:
使用pt-online-schema-change,是percona公司开发的一个工具,在percona-toolkit包里面可以找到这个功能,它可以在线修改表结构
原理:
- 首先它会新建一张一模一样的表,表名一般是_为前缀_new后缀,例如原表为t_user 临时表就是_t_user_new
- 然后在这个新表执行更改字段操作
- 然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
- 最后将原表的数据拷贝到新表中,然后替换掉原表
索引失效
- 使用OR
一个使用索引列,一个不使用