(Java每日一谈:第十六日——就业面试知识通关策略)MySQL数据库

        数据库三大范式是什么?

第一范式:每一列都不可以再拆分(原子性)

第二范式:在第一范式的基础上,非主键列完全依赖于主键(直接依赖)

第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖与其他主键(完全依赖)

        MyISAM索引与InnDB索引的区别?

InnDB索引是聚族索引,MyISAM索引是非聚族索引

InnDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效

MyISAM索引的叶子结点存储的是行数据地址,需要再寻址一次才能得到数据

InnDB非主键索引的叶子结点存储的是主键和其他带索引的列数据,因此查询的时候覆盖索引会非常高效

        InnoDB引擎的四大特性?

插入缓冲

二次写

自适应哈希索引

预读

        什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。食物是逻辑上的一组操作,要么都执行,要么都不执行。

        事务的四大特性(ACID)介绍一下?

原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么安全不起作用。

一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的

隔离性:并发访问数据库时,一个用户的事物不被其他事务所干扰,各并发事务之间的数据库是独立的。

持久性:一个事务被提交之后。它对数据库中数据的改变是持久的。即使数据库发生故障也不应该对其有任何影响。

        什么是脏读?幻读?不可重复读?

脏读:某个事务已更新了一份数据,另外一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会不正确。

不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据

幻读:在一个事务的两次查询中数据笔数不一致

        什么是事务的隔离级别?MYSQL默认的隔离级别是什么?

READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读、不可重复读。 

READ-COMMITTED(读取已提交):允许读取并发事务已提交的数据,可以阻止脏读,但是幻读和不可重复读仍然有可能发生。

PEPEATABLE-READ(可重复读):对同一字段对多次读取结果是一致的,除非数据是被事务本身所修改,可以阻止脏读和不可重复读,但幻读仍然有可能发生。

SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是,该级别可以防止脏读、不可重复读以及幻读。

        隔离级别与锁的关系?

在READ-UNCOMMITTED级别下,读取数据不需要共享锁,跟被修这样就不会改的数据上的排他锁冲突。

在READ-COMMITTED级别下,读操作需要加共享锁,但在语句执行完后释放锁

在PEPEATABLE-READ级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕才释放共享锁

SERIALIZABLE是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,等待事务完成。

        什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法:

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会

2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生的概率

3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。

        数据库中的悲观锁和乐观锁是什么?怎么实现的?

数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据中的同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观锁并发控制(乐观锁)和悲观锁并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制。乐观锁:假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式进行锁定。实现方式:乐观锁一般会使用版本号机制或CAS算法实现。

两种锁的使用场景从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于一种,像乐观锁使用于写比较少的情况下(多读场景),即冲突真的发生很少的时候,这样就可以省去锁的开销,加大了系统的吞吐量。

但是如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一多写的场景下用悲观所比较合适。

        varchar与char的区别?

char的特点:

char表示定长字符串,长度是固定的;如果插入数据的长度小于char的固定长度时,则用空格填充;因为长度固定,所以存取速度要比varchar快很多,但是正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;

对于char来说,最多能存放字符的个数为255,和编码无关

varchar的特点

varchar表示可变长字符串,长度是可变的;插入的数据是多长,就按照多长来存储;varchar在存取方面与char相反,它存取慢,因为长度不固定,但是正因为如此,不占据多余的空间,是时间换空间的做法;

        SQL的生命周期?

1、应用服务器与数据库服务器建立一个链接

2、数据库进程拿到请求sql

3、解析并生成执行计划,执行

4、读取数据到内存并进行逻辑处理

5、通过步骤一的链接,发送结果到客户端

6、关掉连接,释放资源

        大表数据查询,怎么优化?

1、优化schema、sql语句+索引

2、第二加缓存,memcached,redis

3、主从复制,读写分离

4、垂直拆分,根据你模块的耦合度,将一个大的系统拆分为小的系统,也就是分布式系统

5、水平拆分

        MySQL的复制原理以及流程

主从复制:将数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到数据库上,然后将这些日志重新执行;从而使得从数据库的数据与主数据库保持一致。

主从复制的作用

        1、主数据库出现问题,可以切换到从数据库

        2、可以进行数据库层面的读写分离

        3、可以在从数据库上进行日常备份

MySQL主从复制解决的问题:

        数据分布:随意开始或停止复制,并在不同地理位置分布数据备份负载均衡;降低单个服务器压力,高可用和故障切换;帮组应用程序避免单点失败,升级测试,可以使用更高版本的MySQL作为从库

        MySQL主从复制工作原理

        在主库上把数据更高记录到二进制日志从库将主库的日志复制到自己的中继日志

        从库读取中继日志的事件,将其重放到从库数据中。

        MySQL锁:悲观锁、乐观锁、排他锁、共享锁、表级锁、行级锁

乐观锁

用数据版本记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的“version”来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加1。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。

悲观锁

在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟Java中的synchronized很相似,共享锁和排他锁是悲观锁不同的实现。

共享锁

共享锁又叫读锁,所有的事务只能对其进行读操作不能写操作,加上共享锁后在事务结束之前其他事务只能再加共享锁,除此之外其他任何类型的锁都不能再加了。

排他锁

若某个食物对某一行加上了排他锁,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其进行加任何锁,其他进程可以读取,不能进行写操作,需等待其释放。

表级锁

innodb的行锁是在有索引的情况下,没有索引的表是锁定全表的

行级锁

行锁又分共享锁和排他锁,由字面意思理解,就是给某一行加上锁,也就是每条记录加上锁。注意:行级锁都是基于索引的,如果一跳SQL语句用不到索引是不会使用行级锁的,会使用表级锁。

猜你喜欢

转载自blog.csdn.net/weixin_50249953/article/details/124368318
今日推荐