《天净沙·我·mysql篇》 双非菜鸡奇葩,面试项目框架,java java,卑微学子去哪?


别问 问就是为了面试豁出了老命

Mysql事务的特性 - ACID

原子性

和线程是一样的,意思就是要么成功,要么失败 =》 事务要么执行成功,要么执行失败

一致性

从一个一致性到另一个一致性是传递的,就是一个业务流程,一个环节不是一致性,下一个环节就会失败

隔离性

数据库事务和事务之间是隔离的,也就是说事务A看不到事务B,相应的事务B也不晓得事务A干啥

持久性

也就是说,只要事务存入数据库的就是永久存在的,哪怕数据库出异常了,数据也还在

Mysql事务的出现的问题

事务会发生的意外

脏读(Select 没有规矩)

事务A插入了一个数据,但是人家事务A没有提交。结果事务B他没有规矩,他查了一下表,结果发现了事务A插入的数据。这就是脏读

不可重复读(Update 没有规矩)

事务A查询一条数据是A,但是事务b他没有规矩,他更新了数据A变成了B,当事务A再查这条数据的时候,发现变成了B,这就是不可重复读

幻读 (Insert Delete 没有规矩)

事务A差某表,查出A条数据,事务B这时候删了几条数据,事务A此刻又去读了一下,发现数据少了,这就是不可重复读。

数据库隔离级别

未提交读

事务之间可以读取到事务未提交的数据 (完美的符合了上面出现的所有问题)

提交读

顾名思义就是可以读取到已经提交的数据,引申一下,里面涉及到的一种“快照读”,也就是读历史确定的版本

可重复读

也就是悲观锁读,当前的一个事务如果读取到该数据,那么给当前读取上锁,其它事务将无法再获取该数据,但是这个并不能限制事务继续插入数据,所以就会
引起幻读

串行化

顾名思义就是一个一个慢慢来,一次只能来一个,活该这么慢

Mysql的存储引擎

InnoDB

Mysql所默认的一种存储引擎,满足ACID的事务要求,他使用了“一次性非锁定性读”(也就是给数据读取等添加版本,这个里面有些和上述的快照读概念差不
多)

CSV

依靠逗号来分割数据的一种存储方式

InnoDB的一些优点缺点

  1. 行锁粒度,粒度更小,更适合并发场景
  2. 支持事务,有外键
  3. 缺点: 缺点也很明显不支持全文搜索,可以用es搜索

Mysql数据库索引

什么是索引

可以理解成一种排序后的数据结构,通过节点存储索引,之后在查到找相应的结果,通过数据结构加速,比如用二叉树,那么就可以通过节点左右比较减少
遍历查找的次数,当然了如果1 2 3 4 5 6 就会变成链表,如果是红黑树则解决了这个问题,但是会导致深度过深,因此使用B+树,降低深度,添加广度

常用的功能索引

普通索引

就是最基本的添加一个索引,用于加速查找

唯一索引

列值必须唯一,可以为空值,加速查找

主键索引

利用主键作为索引,而且不可以为空,加速查找

覆盖索引

就是查查找的数据也是索引值

组合索引

几列合并成一个索引,但是遵循最左原则

全文索引

全文分词查找,innoDB是做不到的,需要第三方,比如es等

使用索引存在的问题

使用索引的时候不可以随便使用,过度的使用索引会导致消耗大量的资源,热点核心业务的数据应该多使用索引
索引会浪费磁盘空间,不要创建非必要的索引,插入、更新、删除需要维护索引,带来额外的开销,索引过多,修改表的时候重构索引性能差
但是索引使用的时候可以减少查询次数,提高效率

Sql 的查询顺序

  1. from 从哪个表查询
  2. where 初步过滤条件
  3. group by 过滤后进行分组[重点]
  4. having 对分组后的数据进行二次过滤[重点]
  5. select 查看哪些结果字段
  6. order by 按照怎样的顺序进行排序返回[重点]