MySQL面试题

内容分类详情
Java高频面试题汇总入口
JVMJVM面试题
并发并发面试题
SpringSpring面试题
分布式分布式面试题
SpringBootSpringBoot面试题
SpringCloudSpringCloud面试题
DubboDubbo面试题
MySQLMySQL面试题
MybatisMybatis面试题
RedisRedis面试题
RocketMQRocketMQ面试题
算法算法面试题
遇到的问题遇到的问题
面试官的其他问题面试官的其他问题
GitGit面试题

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 大致的执行过程。

  1. 首先客户端发送请求到服务端,跟连接器建立连接
  2. 服务端先看下查询缓存是否命中,命中就直接返回,否则继续往下执行。
  3. 接着来到分析器,进行词法分析、语法分析,一些系统关键字校验,校验语法是否合规等等。
  4. 然后优化器进行 SQL 优化,比如怎么选择索引之类,然后生成执行计划。
  5. 最后执行器调用存储引擎 API 查询数据,返回结果。

大数据量的情况下如何添加字段

方法一:

  1. 添加临时表,把旧表的数据复制过来,把临时表的名称改为旧表的名称。
  2. 检查表数据是否一致,如果存在有新数据,就把新数据同步到新表中。

方法二:

使用pt-online-schema-change,是percona公司开发的一个工具,在percona-toolkit包里面可以找到这个功能,它可以在线修改表结构

原理:

  1. 首先它会新建一张一模一样的表,表名一般是_为前缀_new后缀,例如原表为t_user 临时表就是_t_user_new
  2. 然后在这个新表执行更改字段操作
  3. 然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
  4. 最后将原表的数据拷贝到新表中,然后替换掉原表

索引失效

  1. 使用OR
    一个使用索引列,一个不使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gzh-程序员灿灿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值