文章目录
- 0.谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
- 1.数据库的分类和常用的数据库
- 2.MySQL有几种存储引擎。比较一下InnoDB和MyISAM
- 2.简要介绍一下关系数据库三范式
- 3. 事务四个基本特征 ACID特性
- 4.mysql数据库默认的最大连接数
- 5.说一下mysql的分页?Oracle的分页
- 6.简单讲一下触发器的使用场景
- 7.简要讲一下数据库的存储过程的使用场景
- 7.有没有做过数据库优化方面的事情?
- 8. jdbc调用存储过程
- 9. 简单说一下你对jdbc的理解
- 10。写一个jdbc的程序
- 11.JDBC中的PreparedStatement相比Statement的好处
- 12.数据库中连接池作用
0.谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
典型回答
事务隔离
所谓隔离级别(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性而提出的定义。
每种关系数据库都有自己特色的隔离级别实现,虽然通常的定义是以锁为实现单元。但实际表现千差万别。
以最常见的MySQL innoDB引擎为例,它是基于MVCC(Multi-Versioning Concurrency Control)和锁的复合实现。
按照隔离程度从低到高,MySQL事务隔离级别分为四个不同的层次:
- 读未提交(Read uncommitted),就是一个事务能看到其他事务尚未提交的修改。隔离水平最低,允许脏读
- 读已提交(Read committed),就是事务能看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,也不会出现脏读。但级别仍然很低,并不保证下一次能够读到同样的数据(允许其他事务并发修改数据),也就是允许不可重复读和幻象读出现
- 可重复读(Repeatable reads),保证同一个事务中多次读到的数据是一致的。这是MySQL innoDB引擎默认的隔离级别。
- 串行化(Serializable):并发事务之间是串行的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁。这是最高的隔离级别。
悲观锁/乐观锁
至于悲观锁和乐观锁,也并不是 MySQL 或者数据库中独有的概念。而是并发编程的基本概念。
主要区别在于:
操作共享数据时,悲观锁认为数据出现冲突的可能性会更大,而乐观锁则是认为大部分情况下不会发生冲突,进而决定是否采取排他性措施
反映到MySQL中。悲观锁对数据加锁,防止其他事务意外修改数据。乐观锁则与Java并发包中的AtomicFieldUpdater类似,也是采用CAS机制,并不会对数据加锁,而是通过比较数据的版本号或时间戳来实现乐观锁需要的版本判断
1.数据库的分类和常用的数据库
数据库的分类:
- 关系型数据库
- 非关系型数据库
常用的关系型数据库:
- MySQL
- Oracle
常用的非关系型数据库:
- redis
- mongodb
- hadoop
2.MySQL有几种存储引擎。比较一下InnoDB和MyISAM
存储引擎
MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。
每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛而不同的功能。
MySQL支持的存储引擎有
- MyISAM
- InnoDB
- Memory
- CSV
- Archive
并发控制
当多个连接对记录进行修改时保证数据的一致性和完整性
在处理并发读和并发写的时候,系统会使用一些锁系统来控制。
这里的锁有
- 共享锁(读锁):同一时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生变化
- 排他锁(写锁):在任何时候只加粗样式能有一个用户写入资源,当进行写操作时会阻塞其他的读锁或者写锁操作。
锁的粒度指得是锁定时的单位。只需要对修改的数据精确加锁,而无需对所有数据加锁。加锁只需要加最对的,不需要最大的。加锁会增加系统开销。锁策略寻求锁开销与数据安全之间寻求一种平衡。
MySQL的锁颗粒
- 表锁,开销最小的锁策略,获取整个表的权限
- 行锁,开销最大的锁策略,支持最大并发处理
事务处理
事务用来保证数据库的完整性
事务特性:
- 原子性
- 一致性
- 隔离性
- 持久性
索引
对数据库中的一列或多列进行排序的一种结构。好比于书的目录。
Memory其实是存储在内存中,大小由内存决定。
MyISAM:适用于事务处理不多的情况
InnoDB:适用于事务处理比较多,需要由外键支持的情况。
MyISAM与InnoDB的区别
- 事务安全
- 查询和添加速度 (myisam不用考虑同步锁,速度快)
- 全文索引 (myisam支持)
2.简要介绍一下关系数据库三范式
什么是范式
简单理解就是规范,就是关系型数据库在设计表的时候要遵循的规范
要满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式
第一范式指 数据库中表的每一列都是不可分割的基本数据项,同一列中不可能有多个值。即实体中的某个属性不能有多个值或不能有多个重复的属性。列数据的不可分割
第二范式指 数据库中表的每一行必须可以被唯一的区分。为实现区分通常需要为表加上一个列,以识别各个实例的唯一标志。主键
第三范式指 要求一个数据表中不能包含已在其他表中已包含的非主关键字信息 外键
反三范式,有的时候为了效率,可以设置重复或者可以推导的字段
订单(总价)和订单项(单价)
3. 事务四个基本特征 ACID特性
什么是事务
事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做要么都不做,是一个不可分割的工作单位。
比如一个转账 必须 A账号扣钱成功 B账号加钱成功 这就是事务
事务必须满足四大特征:
- 原子性 (表示事务内操作不可分割。要么都成功,要么都失败)
- 一致性 (要么都成功,要么都失败。后面的失败了要对前面的操作进行回滚,保持数据一致 )
- 隔离性 (一个事务开始后,不能受其他事务干扰)
- 持续性 (表示事务开始了,就不能停止)
4.mysql数据库默认的最大连接数
为什么需要最大连接数?
特定服务器上的数据库只能支持一定数目同时连接,这时候我们一般都会设置最大连接数(最多同时服务多少连接)。在数据库安装的时候都会有一个默认的最大连接数100。
max_connections=100
最大连接数是100。
5.说一下mysql的分页?Oracle的分页
为什么需要分页?在很多数据库,不可能完全显示数据,进行分段显示
mysql是使用关键字limit进行分页的
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
limit offset,size 第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目
Oracle的分页大部分情况下是记不住的,大概是使用三层嵌套查询 思路可以从之前项目翻或者上网搜
6.简单讲一下触发器的使用场景
触发器需要有触发条件。当条件满足以后做什么操作
触发器的应用场景还是很多的,比如QQ上发一个日志自动通知好友,其实就是在增加日志的时候做一个后触发,再向通知表中写入条目。触发器的效率非常的高。
每发布一个帖子,就希望同时将版面表中的最后发帖时间、帖子总数进行同步更新,用触发器效率就非常高
create trigger insertArticle_Trigger after insert on artrcle1 for each row begin
update board1 set articleCount=articleCount+1 where id = NEW.bid
end;
7.简要讲一下数据库的存储过程的使用场景
数据库存储过程具有以下优点
- 存储过程只在创建时进行编译,以后每次执行都不需再重新编译。而一般SQL语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度
- 复杂的业务逻辑需要多条SQL语句,这些语句要分别从客户机发送到服务器,如果操作很多会发生大量的网络传输,如果把这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会减少,减低网络负载
- 存储过程创建一次便可以重复使用,降低数据库开发人员的工作量
- 安全性高,存储过程可以屏蔽对数据库对象的直接访问
定义存储过程
create procedure insert_Student(_name carchar(50),_age int,out_id int)
begin
insert into student value(null,_name,_age);
select max(stuId) into _id from student;
end;
call insert_Student('wfz',23,@id)
select @id;
7.有没有做过数据库优化方面的事情?
定位:查找、定位慢查询
优化手段:
- 创建索引。创建完合适的索引,可以先在索引中查询,查询到以后直接在索引中查询
- 分表:一张表的数据比较多或者一张表的某些字段的值比较多但是很少使用时,采用水平分表和垂直分表来优化
- 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群
- 缓存:使用redis缓存
- 一些常用的优化技巧
7.1 查找并定位慢查询
在项目转测试之前,启动mysql数据库时开启慢查询,并且把执行慢的语句写入到日志中去,运行一定时间后,通过查找日志找到慢查询语句
使用explain 慢查询语句,详细分析语句的问题
7.2 数据库优化之遵循范式
1范式列具有原子性
2范式表中记录具有唯一性
3范式外键(表的信息如果能推导出来,就不应该单独设计一个字段)
7.3 选择合适索引
7.4 索引使用的小技巧
索引弊端:
- 占用磁盘空间
- 对(插入、修改、删除)操作有影响,变慢
使用场景
3. 在查询的时候做,不做查询不做
4. 字段不是唯一的几个值(比如sex)
5. 内存字段不是频繁变化
7.5 数据库优化之分表
分为水平分表(行)和垂直分表(列)
后期再看https://www.bilibili.com/video/av29546706/?p=71
8. jdbc调用存储过程
jdbc调用所执行的步骤
- 加载驱动(com.mysql.jdbc.Driver)
- 获取连接
- 设置参数
- 执行
- 释放连接 (释放连接要从小到大,必须放到finall中去)
9. 简单说一下你对jdbc的理解
Java Database connection
数据库(mysql、server)有很多,底层命令都是不一样的.
为了适用所有的数据库,需要定义一个接口。由各种服务器使用自己的语言去实现java接口,这个接口就是jdbc。
java只定义接口,让服务器厂商实现接口。对开发者而言,只需要导入对应厂商的实现即可,然后以接口的形式进行调用(mysql+mysql驱动+jdbc)
10。写一个jdbc的程序
jdbc调用所执行的步骤
- 加载驱动(com.mysql.jdbc.Driver)
- 获取连接 (DriverManger.getConnection(url,username,password))
- 设置参数 (cstmt.setXXX(index,value))
- 执行 (executeQuery executeUpdate)
- 释放连接 (释放连接要从小到大,必须放到finall中去)
11.JDBC中的PreparedStatement相比Statement的好处
大多数时候采用PreparedStatement代替Statement
- PreparedStatement是预编译的,比Statement速度快
- PreparedStatement代码的可读性和可维护性好
- PreparedStatement可以防止SQL注入攻击,而Statement不能。因为PreparedStatement是预编译的
12.数据库中连接池作用
- 限定数据库连接的个数 不会导致由于数据库连接过多而导致系统运行缓慢或崩溃
- 数据库连接不需要每次都去创建或销毁,节约了资源,
- 数据库连接不需要每次都去创建或销毁 响应时间更快
与线程池的作用类似