春招准备(二)——数据库方面知识

1、数据库事务

四个特性(ACID):原子性、一致性、隔离性、持久性

  •   原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么全发生,要么都不发生
  •   一致性:如果事务执行之前是一个完整的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整的状态
  •   隔离性:当多个用户访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间要数据隔离
  •   持久性:指一个事务一旦被提交,他对数据库的影响是永久性的。

2、事务的隔离级别

脏读

未提交的事务进行数据修改对其他事务都是可见的,如果一个事务读到了其他事务未提交的数据就是脏读。

不可重复读(大部分数据的的隔离级别是这个,mysql不是这个)

在当前事务中,读取到了其他事务的更新和删除的数据(强调更新和删除)

可重复读(mysql默认事务隔离级别)

可以防止脏读、不可重复读,不能防止幻读

序列化:数据库被设计为单线程,可以防止上述所有问题

读已提交:可以防止脏读问题,但是不能防止 不可重复读/幻读问题。(oracle默认隔离级别)

3、范式

第一范式:每一个属性都不可再分,没有重复列或者重复组

第二范式:每一个非主属性都完全依赖于候选码,不存在部分依赖

第三范式:每一个非主属性不能传递依赖,消除传递依赖

BF范式:每一个决定因素中都有码,决定性因素子集中有码,消除任何属性对键的传递函数和部分函数依赖

4、Mysql存储引擎

存储引擎是数据库管理系统用来从数据库创建、读取和更新数据的软件模块。MySQL中有两种类型的存储引擎:事务性和非事务性。

对于MySQL 5.5及更高版本,默认的存储引擎是InnoDB。在5.5版本之前,MySQL的默认存储引擎是MyISAM。

春招准备(二)——数据库方面知识_第1张图片

 

 

 

5、Mysql行级锁

 乐观锁和悲观锁

  乐观锁:每次去哪数据的时候都认为别人不会修改,所以不会上锁,乐观锁适用于多读的应用类型

  悲观锁:悲观锁每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边 就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

共享锁
又称读锁,是读取操作创建的锁,其它用户可以并发读取数据,但是任何事务都不能对数据进行修改。如果事务T对数据加上共享锁后,其它事务只能对A再加共享锁,不能加排他锁。

排他锁
又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的锁。获准排他锁的事务既能读数据,又能修改数据。

6、索引

索引是一种数据结构可以帮我们快速检索数据库中的数据

索引类型

  • 主键索引:主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。
  • 唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空。
  • 普通索引:基本的索引类型,值可以为空,没有唯一性的限制。
  • 全文索引:全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建。可以通过ALTER TABLE或CREATE INDEX命令创建。

索引的数据结构

 hash索引:Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。

 B+ tree索引:B+树是一种多路平衡查询树,他的节点是天然有序的(左节点<根节点,根节点<右节点),所以查询范围的时候不需要全表扫描

其他区别:hasn索引适合做等值查询但是无法做范围查询;hasn索引没法利用索引进行排序;如果有大量重复键值情况下,哈希索引效率很低,可能存在哈希碰撞

 

你可能感兴趣的:(春招准备(二)——数据库方面知识)