做Java开发mysql要学到什么程度?
关注者
146被浏览
118,959登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏
面试过程中,自己总结的关于mysql的知识点。
我将从上述思维导图大致说一下,mysql需要学习的内容。
- MySQL
- 事物
- 概念
用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。 - 特性-ACID
- 原子性
- 一致性
- 隔离性
- 持久性
- 最终目的
事物的最终目的是一致性。 - 事务隔离级别
- 读未提交(read uncommited)
- 读已提交(read commited)
- 可重复读(repeatable read)
- 串行化(serilizable)
- 并发事物带来的问题
- 读-读:不存在问题,不需要并发控制。
- 读-写:有线程安全问题,会有事物隔离性问题,造成脏读,不可重复读和幻读。
- 脏读
- 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据
- 不可重复读
多次select同一条数据,发现结果不一样。针对一条数据。 - 幻读
读一个范围的数据,发现多了一个或者少了一个。针对一堆数据。 - 写-写:有线程安全问题,会有更新丢失问题。
- MVCC
多版本并发控制,在rc和rr事物隔离级别下,实现普通的select操作时访问记录的版本链过程,使读-写操作并发执行,从而提升性能,不用加锁。 - 实现原理
- 解决问题
- 并发读-写时,产生的脏读,不可重复读和幻读问题。
- 用来实现Read commited 和repeateable read 两种隔离级别。
- RC和RR的区别
RC隔离级别,每次select都会生成read view视图。可以解决脏读。
RR隔离级别,只在第一次select生成全局的read view视图。可以解决不可重复读和幻读。 - 当前读
insert update delete 等操作会使用当前读。
会加锁,获取当前数据库中最新数据。 - 快照读
普通select操作。会在select读时,生成一个read view。 - 快照读和当前读混合使用会有问题。
可能类似幻读。
https://www.zhihu.com/question/47007926/answer/1523900737 - 锁
- 共享锁
- 排他锁
- 表锁
- 行锁
- 记录锁(Record Lock):使用主键索引和唯一索引才会使用记录锁。并且查询条件精确匹配。比如,age=10
锁住一个行记录 - 间隙锁(Gap Lock):非唯一索引下使用。
锁一个范围,不包括边界。
比如有 id 为:1、3、5、7 的 4 条数据,我们查找 1-7 范围的数据。那么 2、3、4、5、6都会被加上锁,但是不存在2、4、6这些数据记录, 就被称为间隙。如果想插入记录2、4、6的行就会被阻塞。 - 临键锁(Next-Key Locks):非唯一索引下使用。只有非唯一索引有临键锁。
记录锁和间隙锁的结合,锁住一个范围,是一个左开右闭的区间。 - 作用:在innodb下,当前读默认使用这种锁来解决幻读。
- 索引
- 索引概念
是一种用于加快查询的数据结构。 - 索引优缺点
- 优点
提高检索数据的速度,减少io次数。 - 缺点
1.创建索引,需要浪费磁盘空间
2.维护索引,需要耗费数据库资源
3.增加删除修改,需要动态维护索引,速度会受到影响。 - 按照逻辑结构划分
- innodb存储引擎
- 主键索引
默认为主键添加主键索引,是聚簇索引。 - 单列索性
可以重复,可以为空。 - 唯一索引
不可重复,可以存在一个为空。 - 复合索引
多个索引组合,遵守最左匹配原则。 - 最左匹配原则
①MySQL引擎会优化条件顺序,只要条件中包含了组合索引的全部字段,一定走索引。只包含其中一个或者两个,一定要有最左边的列,才会走索引。
②举例说明。
有组合索引(a,b,c)
1.where a =?
2. where a=? and b=?
3. where a =?and b=? andc=?
以上都走索引,必须要有a这一列,且a不定要在最左边,MySQL会自动优化顺序。 - myisam存储引擎(MySQL5.7以后innodb也有这个索引)
- fulltext全文索引
- 按物理结构划分
- 聚簇索引
索引和数据存储在一起 - 非聚簇索引
索引和数据分开存储 - 回表
从某个索引的叶子节点中找到id,根据id去聚簇索引中查找数据。 - 覆盖索引
从索引的叶子节点就可以查询到需要数据列的过程。 - 数据结构划分
- B+树索引
- Hash索引
- 索引失效
- 使用or和in,is null ,is not null
- 使用“%abc”开头的like查询
- 索引列进行操作(运算,函数等)
- 字符串不加双引号
- 使用不等于≠
- 存储引擎
- Innodb
- Myisam
- 参考链接
- 日志
- redo log:重做日志
- 记录事务对数据库做了哪些修改,确保事物的持久性。
- undo log:回滚日志
- 记录数据库的版本链,用于撤销未提交的事物,实现原子性。
- bin log:二进制日志
- 记录数据库所有增删改操作的SQL语句。
- slow query log:慢查询日志
- 用于记录超时执行的SQL语句。
产生原因
- error log:错误日志
- 记录出错信息
- general log:一般查询日志
- 记录所有对数据请求的信息,不论是否被正确执行。
- relay log:中继日志
- 用来给slave库恢复
- explain分析
- type字段:用来看是否走了索引,除了all其他类型都是走索引。
- extra字段:可以看到解析查询的信息。
- rows字段:估算需要扫描的行数。
- 主从复制
- 原理
- 具体步骤
- 1、MySQL master启动binlog机制,将数据变更写入二进制日志(binary log, 其中记录叫做二进制日志事件binary log events,可以通过show binlog events进行查看)
- 2、MySQL slave(I/O thread)将master的binary log events拷贝到它的中继日志(relay log)
- 3、MySQL slave(SQL thread)重放relay log中事件,将数据变更反映它自己的数据中
希望能对你有所帮助。