一关系型数据库
1、Mysql 部分
1.1 架构图介绍
1.连接管理与安全验证是什么?
每个客户端都会建立一个与服务器连接的线程,服务器会有一个线程池来管理这些
连接;如果客户端需要连接到 MYSQL 数据库还需要进行验证,包括用户名、密码、主机信息等。
2.解析器是什么?
解析器的作用主要是分析查询语句,最终生成解析树;首先解析器会对查询语句的语法进行分析,分析语法是否有问题。还有解析器会查询缓存,如果在缓存中有对应的
语句,就返回查询结果不进行接下来的优化执行操作。前提是缓存中的数据没有被修
改,当然如果被修改了也会被清出缓存。
3.优化器怎么用?
优化器的作用主要是对查询语句进行优化操作,包括选择合适的索引,数据的读取方
式,包括获取查询的开销信息,统计信息等,这也是为什么图中会有优化器指向存储
引擎的箭头。之前在别的文章没有看到优化器跟存储引擎之间的关系,在这里我个人
的理解是因为优化器需要通过存储引擎获取查询的大致数据和统计信息。
4.执行器是什么?
执行器包括执行查询语句,返回查询结果,生成执行计划包括与存储引擎的一些处理操作。
5.存储引擎都有哪些?
1)B InnoDB 存储引擎
InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB
是默认的 MySQL 引擎。
2) MyISAM 存储引擎
MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下
最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事物。
3)Y MEMORY 存储引擎
MEMORY 存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。
6.事务介绍
mysql 和其它的数据库产品有一个很大的不同就是事务由存储引擎所决定,例如
MYISAM,MEMORY,ARCHIVE 都不支持事务,事务就是为了解决一组查询要么全部执行成功,要么全部执行失败。
mysql 事务默认是采取自动提交的模式,除非显示开始一个事务
SHOW VARIABLES LIKE 'AUTOCOMMIT';
修改自动提交模式,0=OFF,1=ON
注意:修改自动提交对非事务类型的表是无效的,因为它们本身就没有提交和回滚
的概念,还有一些命令是会强制自动提交的,比如 DLL 命令、lock tables 等。
SET AUTOCOMMIT=OFF 或 SET AUTOCOMMIT=0
7.事务的 ACID(四大)特性是什么?
答:数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、
一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停
滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开
始前的状态,就像这个事务从来没有执行过一样。
2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。
如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保
每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了
防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个
请求用于同一数据。
4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据
库之中,并不会被回滚。
8.mysql 有四种隔离级别分别是什么:
未提交读(READ UNCOMMITTED):未提交读隔离级别也叫读脏,就是事务可以读
取其它事务未提交的数据。
提交读(READ COMMITTED):在其它数据库系统比如 SQL Server 默认的隔离级别就
是提交读,已提交读隔离级别就是在事务未提交之前所做的修改其它事务是不可见
的。
可重复读(REPEATABLE READ):保证同一个事务中的多次相同的查询的结果是一致
的,比如一个事务一开始查询了一条记录然后过了几秒钟又执行了相同的查询,保证
两次查询的结果是相同的,可重复读也是 mysql 的默认隔离级别。
可串行化(SERIALIZABLE):可串行化就是保证读取的范围内没有新的数据插入,比
如事务第一次查询得到某个范围的数据,第二次查询也同样得到了相同范围的数据,
中间没有新的数据插入到该范围中。
9.创建存储过程怎么写?
“pr_add” 是个简单的 MySQL 存储过程,这个 MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。
1)drop procedure if exists pr_add;
2)计算两个数之和
create procedure pr_add ( a int, b int ) begin declare c int;
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set c = a + b;
select c as sum;
10.触发器怎么写?
触发器语句:
create trigger 触发器的名字 on 操作表
for|after instead of
update|insert|delete