面试笔记1(数据库)

数据库


基础知识

视图是由SELECT语句组成的查询定义的虚拟表, 代表的是一条select语句产生的结果集。 它主要出于两种原因:安全原因, 视图可以隐藏一些数据, 另一原因是可使复杂的查询易于理解和使用。

数据库的三级模式

  • 模式

又称概念模式, 是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。

  • 外模式

是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。

  • 内模式

是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。


共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

如果ORDER BY子句后未指定ASC或DESC,默认使用ASC(升序)

主键、外键和索引的区别?
主键 外键

主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个表只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键:在一个表中存在的另一个表的主键称此表的外键。

索引结构

索引一般有两种结构:哈希索引和BTree索引

哈希索引会产生一张索引表,把数据通过算法换算成哈希值,索引表存储这些哈希值,并在表中保存指向数据的指针,值得注意的是索引表存储哈希值时打乱了原有的存储顺序。哈希索引查找一条数据时特别快速,优于BTree索引,但因为打乱了原有的数据顺序,不支持范围查找与排序功能。

B+Tree所有索引数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针。BTree索引查找单条数据的速度不如哈希索引,但是更加适用于范围查找与排序,所以用的最为广泛,引擎innodb与MyIsam都使用了BTree索引。

为什么用BTree做索引结构

哈希:虽然单词查询快,但是没有顺序,不适合范围查询

二叉树:树的高度不均匀,不能自平衡,查找效率与树的高度有关,IO代价高

红黑树:树的高度随数据量而变,IO代价高(数据量过大时,树的深度越高,IO读写越频繁)

Btree:数据很大时,不可能放在内存,所以放在磁盘上,BTree 每层节点数多,层数少,减少了IO读写次数,查询结果更加稳定


一、事务

是作为单个逻辑单元执行的一系列操作

  1. 原子性:要么全部成功,要么全部失败回滚

  2. 一致性:一个事务执行之前和执行之后都必须处于一致性状态

  3. 隔离性:事务不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

3.1 隔离级别

3.1.1 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

3.1.2 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3.1.3 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

  1. 持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的

二、范式

范式是符合某一种级别的关系模式的集合

第一范式:原子性
原子性

字段不可再分

第二范式:唯一性

有主键,非主键字段依赖主键;一个表只说明一个事物;

第三范式:无传递依赖

每列都与主键有直接关系,不存在传递依赖。

三、MYSQL优化方法

a. 怎么发现有问题的SQL?(通过MySQL慢查询日志对有效率问题的SQL进行监控)

通过MySQL的慢查询日志,我们可以查询出执行的次数多占用的时间长的SQL

b. 通过explain关键字查询和分析SQL的执行计划

c. SQL优化

(语句优化)

  1. 优化嵌套查询:子查询可以被更有效率的连接(Join)替代;

  2. 优化insert语句:一次插入多值;

  3. 当只用一行数据时,select 1

  4. 拆分大查询,有些操作会锁表。把操作分割,避免表被锁定太长时间。

(索引优化)

  1. 建立索引(索引用于查询操作多、表大的情况,会增加插入删除修改以及空间的开销)

表结构的水平垂直拆分优化)

四、Mysql引擎

数据库引擎是用于存储、处理和保护数据的核心服务。

MySQL存储引擎主要有:InnoDB、MyIsam。

InnoDB是一个事务型的存储引擎,有行级锁定和外键约束, 实现了SQL标准的四种隔离级别。

适用场景:经常更新的表,适合处理多重并发的更新请求。支持事务。

MyIsam

MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT或UPDATE数据时即写操作需要锁定整个表。

Redis 支持的数据结构丰富,包括hash、set、list等。

MongoDB 数据结构比较单一,但是支持丰富的数据表达

Redis是单线程的,但是为什么这么高效呢?

虽然Redis文件事件处理器以单线程方式运行,但是通过使用I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他同样以单线程运行的模块进行对接,这保持了Redis内部单线程设计的简单性。

五、约束

用于限制加入表的数据的类型, 是在表中定义的用于维护数据库完整性的一些规则

1、not null(不能为空)

2、unique(此字段的每条记录必须唯一,一般我们用来约束id,他和primary key一样,都对字段保证了唯一性)

3、primary key(设置此字段为这张表的主键,每个表应该有一个主键,而且每个表都只能有一个主键,主键字段必须唯一且不能有null值)

4、foreign key(设置此字段为这张表的外键,它指向另一张表的主键。)

5、check(约束用于限制字段中的值的范围)

6、default(默认值,如果定义了默认值,再插入数据时如果没有插入数据,会根据默认值插入)

你可能感兴趣的:(面试笔记1(数据库))