MySQL

一、InnoDB和MyISAM有什么区别
InnoDB:支持外键、MySQL的默认事务型引擎、缓存索引也缓存真实数据,对内存要求比较高、使用的行级锁
缺点:对写入的效率比较差,对内存要求较高
MyISAM:不支持外键、表级锁、不支持事务、只缓存索引、不缓存正式数据、消耗少适用于简单业务
应用场景:以读和写比较多的业务场景为主
二、索引的分类以及对应的数据结构
索引的优点:降低了数据库的磁盘IO成本。
索引的缺点:以空间换时间。增删改比较慢,因为索引需要重新排序
问:MySQL索引为什么使用B+树
B+树的优点:
普通索引:可以作用在任何数据类型中
唯一索引:索引的值必须是唯一的,允许有一个空值,一个表可以创建多个唯一索引
主键索引:不能有空值,一个表只能有一个主键索引
联合索引:两个或两个以上字段组合创建的索引,遵循最左前缀原则
全文索引:切词,查询数据量比较大的字符串类型的字段时,可以用全文索引提高查询效率
索引的失效场景:
    对索引字段进行数学运算或者函数,索引不起作用
    like通配符开头是使用‘%’索引也会失效
    用‘or’分割开的两个条件,如果有一个条件没有索引,则不会使用索引
    使用联合索引时,不满最左原则也会失效
    需要类型转换时索引也会失效(字段类型为varchar,查询条件值为number就会失效)
三、什么是回表、索引覆盖、索引下推:
    回表:
        如果索引不包含我们需要查找的全部字段,第一次查询先查到主键值,然后根据查到的主键值找到叶子节点存储的主键值再进行一次查找来找到我们需要的数据,这就是回表查询
    索引覆盖:
        索引中包含了查询中的所有字段,这种情况下就不用进行回表操作,速度更快
    索引下推:
        MySQL5.6进入的索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数
四、事务的ACID
原子性:原子性是指一个事务是一个不可分 割的工作单位,其中的操作要不都做,要不都不做
一致性:一个数据在执行前后,数据库都必须处于一致性状态
隔离性:每个事务内部的操作和其他事务是隔离的,并发执行各个事务不能互相干扰
持久性:事务一旦提交,数据库的改变就是永久性的,接下来的其他操作和故障对他不影响
总结:
    持久性(redo log 重做日志)
    原子性(undo log回滚日志)
    MVCC+锁,实现了事务隔离性
    一致性则是由redolog与undo log保证
、事务的隔离级别有哪些,他们分别解决了什么问题
I nnoDB默认的隔离级别是可重复读
SQL标准定义了四种隔离级别:
    READ_UNCOMMITTED(读未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读和不可重复读
    READ_COMMITTED(读已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读,不可重复读还是可能发生
    REPEATABLE_READ(可重复读):对同一字段的多次读取效果都是一致的,除非是本身事务自己所修改,可以阻止脏读,不可重复读,但幻读仍有可能发生
    SERIALIZABLE:最高的隔离级别,加锁,完全服从ACID的隔离级别。所有的事务逐次执行。避免了脏读、幻读和不可重复读
六、什么是脏读、脏写、不可重复读、幻读
   脏写:两个事务线程A,B同时更新一条数据,A更新完了,B更新失败,会用B的undo_log日志去回滚到A,B更新之前的数据,导致A更新好的数据也没了
    脏读:一线程中的事务读取到了二线程中未提交的数据,
    不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据(一个事务线程两次读取的值不一样)
    幻读:指一个线程中的事务读取到了另外一个线程中提交的insert
七、MVCC实现原理
实现原理主要依赖于记录中的两个隐藏字段,undolog,read view来实现的
ReadView视图
m_ids:当前活跃
min_trx_id:最小活跃事务ID
max_trx_id:当前最大事务ID
creator_trx_id:当前事务ID
ReadView中版本链的数据匹配规则
规则1.拿着版本链中最新的事务id跟当前活跃的最小id作比较
规则2.拿着版本连中最新的事务Id跟最大的事务id作比较
规则3.如果当前活跃最小id<=版本链中最新事务id<=当前最大事务id
规则4.如果当前事务id等于版本链中最新的事务id
MVCC解决了RR(可重复读)隔离级别下的不可重复读问题
问:为什么解决了RR的不可重复读问题,那为什么RC隔离级别下的不可重复读问题没有解决呢
答:隔离级别真正的区别不是在于过滤的条件而是在于ReadView生成的时机不同
1、RC读已提交
RC的隔离级别下,每次查询时都会生成一个新的ReadView。
这就导致我们每次查询数据的时候,生成的ReadView都会发生改变,导致只要中途别的事物修改并提交,每次读取到的都是最新提交的数据,产生了不可重复读问题
2、RR的隔离级别下,第一次查询生成新的ReadView,之后的查询复用第一次的ReadView
因为这个时候的修改该条数据的事务一定是在ReadView生成之后生成的,ReadView的版本匹配规则也一样,根据规则二,无法访问该版本,解决了幻读问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值