java面试——mysql相关(代码片段)

JohnnyLin00 JohnnyLin00     2023-01-01     469

关键词:

数据库基础

什么是事务?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功。即使一个操作失败,事务也不会成功。如果所有操作成功则事务提交,其修改将作用于其他数据库进程。如果操作失败,则事务将回滚,该事务所有操作的影响都将被取消。

事务的特性:(ACID)

事务具有4个特征。分别是原子性、一致性、隔离性、持久性。简称事务的ACID特性

  1. 原子性(atomicity): 即不可分割性,事务要么全部执行,要么就全部不被执行。
  2. 一致性(consistency):事务的执行使得数据库从一种正确状态转换成另一种正确状态。如果数据库系统自运行过程中发生了故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已经写入物理数据库,这时数据库就处于一种不正确的状态,也就是不一致状态。即执行事务前后,数据保持一致。
  3. 隔离性(isolation): 在事务正确提交之前不允许把该事务对数据的任何改变提交给任何其他事务。即事务之间是互不干扰的,各并发事务之间是独立。
  4. 持久性(durability):事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

ACID实现原理

MySQL ACID是如何实现的

ACID中,AID是手段,C是目的。

  • 原子性(A)通过UNDO_LOG实现,UNDO_LOG记录数据修改过程。通过UNDO_LOG可以是实现事务失败或回滚时回滚,达到原子性目的。
  • 隔离性(I)通过版本控制(MVCC)和锁实现。MVCC控制读取数据的时机。读已提交(RC)和可重复读(RR)两种隔离级别有些许差异。RC级别下,每次执行快照读生成一次ReadView,可以解决脏读,不能解决不可重复读、幻读问题。RR隔离级别下,可以解决不可重复读,能解决部分幻读问题。
    快照读下可以解决幻读问题。当前读不能。
  • 持久性(D),通过REDO_LOG实现。MySQL是硬盘性数据库,为了匹配上CPU速度。MySQL对数据的修改前,会将数据加载到内存来,修改后再写回磁盘。这个过程可能会由于数据库宕机,数据就会丢失,导致数据的不一致性。MySQL使用REDO_LOG解决这一问题,每次修改数据时,除了在内存中修改数据,还会在REDO_LOG 中记录这次操作。当事务提交时,会将redo_log进行刷盘。当数据库宕机重启时,会将REDO_LOG内容恢复到数据库中,在根据UNDO_LOG和BIN_LOG决定回滚还是提交数据。

事务隔离级别

并发事务分类

脏写

脏读

不可重复读

幻读

四种隔离级别

按问题的严重性:
脏写 > 脏读 > 不可重复读 > 幻读

舍弃一部分隔离性来换取一部分性能

READ UNCONMITTED 未提交读
READ COMMITTED 已提交读
REPEATABLE READ 可重复读
SERIALIZABLE 可串行化



Mysql默认事务隔离级别是可重复读

隔离级别的作用: 控制读取数据的时机

解决脏读、不可重复读、幻读问题

X锁和S锁


对于同一条记录来说,
S锁与S锁不互斥。
S锁与X锁互斥。
X锁与X锁互斥
上述说的是不同事务,但是**同一一个事务对某一个记录加S锁后这个仍可对这条记录加X锁 **
对记录加锁,不论对记录加的是S锁还是X 锁。正常的select * from table where查询条件仍可以访问。
解决超卖问题,在数据层面添加的是X锁

MVCC

UNDO_LOG版本链

UNDO_LOG 版本链记录数据变化
UNDO_LOG版本链不是立即删除,Mysql确保版本链数据不再被引用才会删除。

ReadView

ReadView,快照读。是SQL执行时MVCC提取数据的依据。快照读就是执行普通的select 查询语句时生成的视图。
当前读指代执行下列语句时进行数据读取的方式:

insert、update、 select for update、 select …… lock in share mode

读已提交(RC)隔离级别下
在每一次执行快照读时生成ReadView
根据每个时机生成的ReadView按照读取规则从UNDO_LOG 中读取合适的数据。


从上面两个ReadView 生成的时机以及读取结果可以看出RC隔离级别不能解决可重复读问题。

RR


连续多次快照读,ReadView 会产生复用,没有幻读问题。
但是,但两次快照读之间存在当前读,ReadView会重新生成,导致幻读

MVCC优缺点

优点: MVCC使得大多数读操作都可以不用加锁,这样设计使得读数据操作变得很简单,性能也很好,并且也能 保证只会读取到符合标准的行。
缺点: 每行记录都需要额外的存储空间,需要做更多的行检查工作,以及一些额外的维护工作。

从思想上划分 乐观锁和悲观锁
Mysql 中都是悲观锁,没有乐观锁

Redis的Setnx 使用的是悲观锁

乐观锁 悲观锁、MVCC对比

常用SQL 语句

使用mysql root -p  提示权限不够: Access denied for user 'ODBC'@'localhost' (using password: YES)

msyql -u root -p

use goodsadmin; -- 使用数据库


alter table person add column card_id int(12); --增加列card_id
create table IDCard(card_id int(12) primary key, card_code varchar(25)); --创建IDcard 表


alter table 表名 rename to 新表名;  -- 修改表名
alter table 表名 character set 字符编码;  --修改表格的字符编码
alter table person modify card_id varchar(16);  --修改card_id的数据类型
alter table 表名 change 列名 新列名 新数据类型;  --- 修改某一列的列名、数据类型
alter table 表名 drop 列名;  --删除某一列


show tables;  -- 查询当前数据的所有表
desc 表名;   --查看表结构


-- 添加外键约束:alter table 从表 add constraint 外键(形如:FK_从表_主表) foreign key (从表外键字段) references 主表(主键字段);
alter table person add constraint fk_person_IDcard_card_id foreign key (card_id) references IDCard(card_id);    --不加单引号

-- SELECT <字段名> FROM <1> INNER JOIN <2> [ON子句]
select p.* ,c.* from  person p inner join idcard c on p.card_id = c.card_id where p.id = 1; --内连接查询


-- select <字段名> FROM<1> LEFT JOIN <2> [ON 子句]

-- 左连接 如果数据不存在,左表记录会出现,而右表为null填充




alter table person add column nation_id int(12);
create table nation(nation_id int(12) primary key, nation_name varchar(12));
alter table person add constraint fk_person_nation_nation_id foreign key (nation_id) references nation(nation_id);


---增加某列
ALTER TABLE skill ADD COLUMN createdTime TIMESTAMP not null DEFAULT now();

为什么索引使用B+树

  • B+树中,所有数据记录节点都是按照键值大小顺序存放在同一层叶子结点上,而非叶子结点只存储key信息,这样可以大大加大每个节点存储的key值的数量,降低B+树的高度,从而减少磁盘IO访问次数。一般我们存储的数据在百万级别的话,B+树的高度都是三层左右。
  • 除此之外,B+树每次都要访问到叶子结点,查询效率稳定为树的高度。

为什么B+树高度就小,是因为什么,B树为什么就高一些

这是因为B+树中,非叶子结点值存储键值和指向子节点的指针,叶子结点才存储数据。而B树中节点既存储键值、指向字节点的指针、也存储数据。所以在节点大小相同的条件下,B+树能存储的key就越多,因而B+树的高度就就,B树就高一些。

一般我们存储的数据在百万级别的话,B+树的高度都是三层左右
千万行的数据这个B+树索引大概也就3到4层吧。

InnoDB存储引擎操作最小数据大小为16K,B+树中,非叶子节点的占用14字节数据(非叶子节点=主键id为bigint类型占用8字节+索引6字节),因此每层可存储节点161024/14=1170。叶子节点存储数据,假设占用内存大小为1K,那么可存16个数据节点。综上,三层B+树可存数据为:11701170*16=21902400(两千万条数据)

Truncate

TRUNCATE与DELETE的区别

1、DELETE FROM 表名 # 逐行删除每一条记录、

TRUNCATE [TABLE] 表名 # 先删除表后在重新创建 表(效率高)
2、 TRUNCATE不知道删除了几条数据,官方文档的说明是:通常的结果是“ 0行受到影响 ”,这应该被解释为“ 没有信息。”。 而DELETE知道。

3、 TRUNCATE 重置auto_increment的值,delete不会。

为了实现高性能,TRUNCATE绕过了删除数据的DML方法。因此它不能被回滚,不会导致ON DELETE 触发器触发,并且不能对InnoDB具有父子外键关系的表执行

1、 数据库的三大范式

第一范式: 属性不可分。关系中每一个数据不可再分(不能以集合/序列等作为属性),也就是关系中没有重复的列(比如电话号码这个属性既存在一个手机号又存在一个家庭号码,这种情况就不属于第一范式,除非把手机号作为一个列,家庭号码也作为单独一列。);

第二范式: 消除部分依赖。在1NF基础之上,消除非主属性对键的部分依赖,则称它为符合2NF;(把学生编号,课程标号,成绩单独拿出来作为一个表)。属性完全依赖于主键。

第三范式: 在2NF基础之上,消除非主属性对键的传递依赖,称为符合3NF;(要确定这个学生的院系,首先要经过学号来确定班级,通过班级来确定院系,所以院系对学号存在传递依赖;把院系拿出来单独作为一个表就可以了)。
使属性不依赖于其它非主属性。 也就是说, 如果存在非主属性对于码的传递函数依赖

备战面试面试题打卡——mysql相关面试题总结(代码片段)

⭐️写在前面这里是温文艾尔的学习之路👍如果对你有帮助,给博主一个免费的点赞以示鼓励把QAQ👋博客主页🎉温文艾尔的学习小屋⭐️更多文章👨‍🎓请关注温文艾尔主页📝🍅文章发布日期&... 查看详情

阿里字节腾讯等大厂java岗mysql面试高频面试题整理(代码片段)

索引相关1.什么是索引?索引是一种数据结构,可以帮助我们快速的进行数据的查找.2.索引是个什么样的数据结构呢?索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的Inno... 查看详情

[灵魂拷问]mysql面试高频问题(工程师方向)(代码片段)

[灵魂拷问]MySQL面试高频问题(工程师方向)程序君 JAVA高级架构 2020 作者丨呼延十juejin.im/post/5d351303f265da1bd30596f9前言本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水.前一阵... 查看详情

java相关面试题总结+答案(代码片段)

【容器】18.Java容器都有哪些?19.Collection和Collections有什么区别?Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等。Collections是一个包装类,包含了很多静态方... 查看详情

java相关面试题总结+答案(代码片段)

【Hibernate】113.为什么要使用hibernate?hibernate是对jdbc的封装,大大简化了数据访问层的繁琐的重复性代码。hibernate是一个优秀的ORM实现,很多程度上简化了DAO层的编码功能。可以很方便的进行数据库的移植工作。提供了缓存机制... 查看详情

java核心面试宝典day12“java虚拟机”相关面试题大总结(代码片段)

...活变得更智能、世界变得更有趣!在此专栏《Java核心面试 查看详情

java核心面试宝典day12“java虚拟机”相关面试题大总结(代码片段)

...活变得更智能、世界变得更有趣!在此专栏《Java核心面试 查看详情

mysql高频面试题,最常问!(代码片段)

...下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好 查看详情

java面试题超详细整理《mysql篇》(代码片段)

MySQL介绍MySQL是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据比如用户信息。MySQL是开源软件,使用时无需付费,并且他还是比较成熟的数据库,被大量使用在各种系统中。MySQL的默认端口号是33... 查看详情

java面试题超详细整理《mysql篇》(代码片段)

MySQL介绍MySQL是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据比如用户信息。MySQL是开源软件,使用时无需付费,并且他还是比较成熟的数据库,被大量使用在各种系统中。MySQL的默认端口号是33... 查看详情

java运算符相关面试题(代码片段)

面试题1:逻辑双与&&和逻辑单与&的区别?(逻辑双或||以及逻辑单或|,同理)共同点:都可以表示并列关系,有false,则false都可以表示或者关系,有true,则true区别:逻辑双与&&,如果左边的表达式位false,则符号右边的表... 查看详情

java之java相关异常知识点java面试题(代码片段)

1、final、finally、finalize的区别?●final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。●finally:异常处理语句结构的一部分,表示总是执行。●finalize&#x... 查看详情

mysql面试大全,看完可以吊打面试官!!!(代码片段)

最近有小伙伴出去面试,感觉总是被mysql的问题吊打。最近小孟整理一些mysql的面试题,希望能帮助到你。推荐优质文章:1,送你50个项目2,Java学习全栈路线Java学习大全3,学生信息系统开源4,Springclou... 查看详情

java之final相关内容详解面试题(代码片段)

1、final关键字除了修饰类之外,还有哪些用法呢?(1)final修饰的变量,一旦赋值,不可重新赋值;(2)如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,... 查看详情

java之final相关内容详解面试题(代码片段)

1、final关键字除了修饰类之外,还有哪些用法呢?(1)final修饰的变量,一旦赋值,不可重新赋值;(2)如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,... 查看详情

java开发社招面试经验:java连接mysql登录界面(代码片段)

京东一面凉经object的方法,7大方法synchronized方法讲解synchronized方法实现原理volatile关键字的原理锁的分类偏向锁讲解NoClassDefFoundError和ClassNotFoundException的区别追问,ClassNotFoundException是不是只发生在编译时,运行时可... 查看详情

java之string相关内容详解(字符串和字符串常量池)面试题(代码片段)

1、String可以被继承吗?String类在声明时使用final关键字修饰,被final关键字修饰的类无法被继承。Cannotinheritfromfinal"java.lang.String’无法从最终的“java.lang.String”继承接下来我们可以看一下String类的源代码片段:publi... 查看详情

java之运算符相关内容详解面试题(代码片段)

1、Java运算符计算机的基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富运算符来操作变量,我们可以把运算符分成以下几组?算术运算符关系运算符位运算符逻辑运算符赋值运算符其... 查看详情