Mysql技术总结

本文详细介绍了MySQL的存储引擎,包括MyISAM和InnoDB的区别,以及它们在事务处理和锁机制上的差异。讨论了数据库范式及其在实际应用中的权衡。详细讲解了事务的ACID特性、隔离级别,以及它们如何解决并发问题。还深入探讨了脏读、不可重复读和幻读等现象。此外,文章详细阐述了索引的类型、数据结构以及可能导致索引失效的场景。最后,讨论了MySQL的锁机制、日志系统(如binlog和redolog)以及数据库的分区、分库分表策略,帮助读者深入理解MySQL的高性能设计和优化方法。
摘要由CSDN通过智能技术生成

1.mysql的存储引擎有哪些,区别?

mysql 5.5之前默认是myisam,之后是innodb。
区别:
innodb支持表锁,行锁,间隙锁。myisam支持表锁。
innodb是聚簇索引,索引和数据存储在一起。myisam是非聚簇索引,索引和数据分开存储。
innodb支持事务,myisam不支持。

innodb支持外键,myisam不支持。

2.数据库范式?为什么反范式?

数据库设计有三大范式。第一范式不可再分,第二范式解决部分依赖,第三范式解决传递依赖。

部分依赖:
举例:在关系“学生选课(学号, 姓名, 课程号, 成绩)”中,主键是(学号, 课程号)。假设“姓名”列只由“学号”决定,与“课程号”无关,那么“姓名”对(学号, 课程号)是部分依赖关系。

传递依赖:
举例:在关系“学生(学号、姓名、所在系, 系主任)”中,主键为(学号)。如果“系主任”由“所在系”决定,且“所在系”又由“学号”决定,那么“系主任”对“学号”是传递依赖关系。


因为生产开发中,数据量往往都很大,数据量大的时候联合查询笛卡儿积会比较大,效率慢,经常需要反范式去添加冗余字段。

3.事务特性,隔离级别?分别解决了什么?

四大特性:
A原子性 - 保证事务内操作要么都执行成功,要么都失败。
原理:依赖undolog版本链实现,是逆向操作。因为undolog记录相反的操作sql,如果回滚,会逆向执行,恢复数据。

C一致性 - 保证业务数据一致性,比如银行转账,保证两个账户之间总金额不变。
原理:依赖其他三个特性实现。

I隔离性 - 保证事务之间相互独立,互不影响。

四大隔离级别: 

1.读未提交 - 可以读到未提交的数据,可能发生脏读,不可重复读,幻读等问题。

2.读已提交 - 只能读到已经提交的数据。

原理:通过行锁和mvcc共同实现该隔离级别?

https://blog.51cto.com/u_16213571/7912774
脏读:比如说有两个事务,事务1先修改某数据,事务2此时读取,事务1回滚,事务2此时读取到的数据是脏数据。

3.可重复读 - 解决了不可重复读的问题
不可重复读
比如两个事务,事务1先读一遍数据,事务2修改数据并提交,事务1再次读取,结果与第一次数据不一致。
原理:使用了mvcc多版本并发控制。其实是通过readview通过当前行的隐藏字段结合当前行的版本链去实现数据可见性。
首先readview有四个隐藏字段,活跃事务列表,最大事务id,最小事务id,当前事务id。
可见性原则的实现是拿当前行的最新事务id与read比较,具体规则如下:
1.最新事务id如果大于等于最大事务id则不可见
2.最新事务id小于最小事务id,则可见
3.最新事务id在最大最小之间,且不在活跃列表内,则可见。
4.若等于活跃列表内的,则不可见
可重复读解决了快照读语义下的幻读问题,部分解决了当前读语义下的幻读问题
比如在一个事务中,两次快照读中间使用了当前读
场景如下,事务1先查,事务2插入,事务1更新该数据,事务1再查,这个问题就无法解决。

4.串行化 - 通过把事务顺序添加到队列,保证安全性,效率极慢
幻读 - 事务1查,事务2插入,事务1查,两次数据不一样
D持久性 - 保证数据持久化到磁盘上

原理:通过buffer pool 和redolog实现。
首先数据进行修改时,先将数据库数据所在页拉取到内存,然后在buffer pool中修改,同时更新到redolog buffer,然后刷盘策略时,定期持久化磁盘上的redolog中,然后这里采用了wal先写日志的思想,如果数据库宕机,也可以通过读取redolog中的数据恢复数据。

4.脏读,脏写,幻读,不可重复读?

脏读:比如说有两个事务,事务1先修改某数据,事务2此时读取,事务1回滚,事务2此时读取到的数据是脏数据。

脏写:在未提交的数据基础上进行了修改
不可重复读
比如两个事务&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

低调$(生活)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值