数据库面试题--基础篇

------------------------------------------SQL------------------------------------

一、关系型数据库和非关系型数据库

1、关系型数据库(SQL)指用关系模型来组织数据的数据库。常见的关系型数据库有Oracle, MySQL,Microsoft SQL Server, PostgreSQL,SQLite,IBM DB2...

2、非关系型数据库(NoSQL),不仅仅是SQL,数据以对象的形式存储在系统中,对象之间的关系通过每个对象自身的属性来决定。通常用于存储非结构化数据。常见的NoSQL有:redis、HBase等。

二、drop、delete、truncate的区别?

drop用来删除表或数据库并将表所占用的空间全部释放。

delete只删除记录。

truncate会清除表数据并重置id从1开始。

三、数据库的分页是怎么做的?

参考资料:数据库的分页是怎么做的?-CSDN博客

四、什么是子查询?

指在一个查询语句中使用另一个查询语句的过程。

五、数据库中的存储过程和函数

参考资料:数据库中的存储过程和函数-CSDN博客

六、数据库中的锁

1、粒度锁

(1)全局锁:针对整个数据库的锁,全局锁的典型使用场景是,需要确保整个数据库一致性的操作,例如做全库逻辑备份。

# 全局锁,简称FTWRL 
FLUSH TABLES WITH READ LOCK; 
# 解锁命令 
UNLOCK TABLES;

①读锁(共享锁):阻止其他用户更新数据,但允许读取数据。

②写锁(排他锁):阻止其他用户读取和更新数据

(2)表锁:典型应用场景:全表更新或删除

# 给表添加读锁或写锁 
lock tables employee read/write; 
# 解锁 
unlock tables;

(3)行锁:主要由innoDB引擎提供,应用场景:高并发读取操作,单行操作。

七、视图与游标

1、视图:是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图

通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更

容易,相比多表查询。

2、游标:是对查询出来的结果集作为一个单元来有效的处理。游标能够对结果集中的每一条记录

进行定位,并对指向的记录中的数据进行操作的数据结构。一般不使用游标,但是需要逐条处理数

据的时候,游标显得十分重要。

八、where, on 和having有什么区别?

1、where和having的根本区别在于: where在group by和聚合函数之前对数据进行过滤; having在group by和聚合函数之后对数据进行过滤;

2、where和on的区别在于: 内连接中,on和where等价; 外连接,on中的过滤条件在连接操作之前执行,而where在连接操作之后执行。

在查询过程中执行顺序:from>where>group(含聚合)>having>order>select。

九、SQL各子句的执行顺序。

先有表(from、on、join),才能过滤(where),再才能分组(group、having),再才能选择去重(select distinct),再才能排序(order by),最后才能分页(limit)

总的顺序:from>join>where>group by>聚合函数>having>select>order by>limit

---------------------------------------事务----------------------------------------

一、定义

数据库事务(Database Transaction)指单个工作的逻辑单元执行的一系列操作,要么完全执行,

要么完全不执行,不可分割。一个逻辑单元要成为事务,必须满足ACID(Atomicity, Consistency,

Isolation, Durability) ,原子性,一致性,隔离性,持久性。

二、ACID

1、原子性:数据库中事务要么完全执行,要么完全不执行

2、一致性:一致性是指事务必须使数据库一致性状态不变,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

3、隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

4、持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的(固化到硬盘),即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

三、mysql中四种隔离级别

1、读取未提交,最低的隔离级别,可能导致脏读、幻读或不可重复读。

2、读取已提交,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

3、可重复读,可以阻止脏读和不可重复读,但幻读仍有可能发生。

4、串行化,最高的隔离级别。可以阻止脏读、幻读以及不可重复读。

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

1、脏读:事务A读取到了事务B已经修改但尚未提交的数据(事务B回滚)

2、不可重复读:事务A内部的相同查询语句在不同时刻读出的结果不一致(修改)

3、幻读:事务A读取到了事务B提交的新增数据

五、MySQL的ACID特性分别是怎么实现的?

1、原子性

原子性的含义就是之前成功执行的sql语句能够撤销。InnoDB实现回滚,靠的是undo log:当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

2、持久性

持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。redo log被引入来解决这个问题:当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作;当事务提交时,会调用fsync接口对redo log进行存盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。

3、隔离性

  • (一个事务)写操作对(另一个事务)写操作的影响:锁机制

保证隔离性事务在修改数据之前,需要先获得相应的锁;获得锁之后,事务便可以修改数据;该事务操作期间,这部分数据是锁定的,其他事务如果需要修改数据,需要等待当前事务提交或回滚后释放锁。

  • (一个事务)写操作对(另一个事务)读操作的影响:MVCC保证隔离性(参考资料数据库中的MVCC--多版本并发控制-CSDN博客):

① 隐藏列:InnoDB中每行数据都有隐藏列,隐藏列中包含了本行数据的事务id、指向undo log的指针等。

② 基于undo log的版本链:前面说到每行数据的隐藏列中包含了指向undo log的指针,而每条undo log也会指向更早版本的undo log,从而形成一条版本链。

③ ReadView:通过隐藏列和版本链,MySQL可以将数据恢复到指定版本;但是具体要恢复到哪个版本,则需要根据ReadView来确定。所谓ReadView,是指事务(记做事务A)在某一时刻给整个事务系统(trx_sys)打快照,之后再进行读操作时,会将读取到的数据中的事务id与trx_sys快照比较,从而判断数据对该ReadView是否可见,即对事务A是否可见。

4、一致性

一致性是事务追求的最终目标,前问所诉的原子性、持久性和隔离性,其实都是为了保证数据库状态的一致性。

------------------------------------索引-------------------------------------------

一、种类

1、按照约束条件可以分为:普通索引、全文索引、唯一索引、主键索引

2、按照列数可以分为:单列索引和组合索引

alter table tablename add index ('字段名'); # 普通索引 
primary key('字段名') # 主键索引,通常在表定义时使用,不能通过alter添加一个主键 
alter table tablename add fulltext ('字段名') # 全文索引 
alter table tablename add unique ('字段名') # 唯一性索引 
alter table tablename add index ('字段名1', '字段名2', ...) # 组合索引,就是多个列的索引

二、数据库中的索引

1、定义:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据表中的特定信息。

2、目的:索引的一个主要目的就是加快数据检索速度。

3、索引的优点

(1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

(2)可以大大加快数据的检索速度,这也是创建索引的最主要原因。

(3)帮助服务器避免排序和临时表

(4)将随机IO变为顺序IO。

(5)可以加速表与表之间的连接,在实现参照完整性有重要意义。

三、索引底层如何实现?

一般分为B+树索引和哈希索引:

1、B+树索引:其非叶子节点均为key,叶子节点是key-data键值对,叶子节点前后相连且有序。

2、哈希索引:对key进行散列化,存储在不同的桶中,可以做到常数时间复杂度的查找,删除和插

入。但要注意哈希冲突的避免(链表法,线性检测,二次探测,公共溢出区方法)

四、为什么有了B+树还要索引还要hash索引?

1、B+树默认有序而hash表默认无序,所以哈希索引无法用于排序;

2、哈希索引O(1) 在速度上快于B+树O(logn)

3、哈希索引只能进行等值查询(因为它要计算hash(key)再去匹配),而B+树可以进行等值、部分前缀、范围查询;

4、底层实现结构不同:B+树是非线性结构,hash的桶是线性结构。

5、对于某些场景如热点页/活跃查询页,需要借助哈希索引来快速查询。

五、为什么使用B+树而不使用B树?

1、IO次数更少:由于B+树在非叶子节点上不包含数据信息,因此在内存页中能够存放更多的key。

2、遍历次数少:B+树的叶子结点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而B树则需要进行每一层的递归遍历。

3、B+树由于数据顺序排列并且相连,所以便于区间查找和搜索

六、聚簇索引和非聚簇索引的区别?

聚集索引和非聚集索引不是一种索引类型,而是物理存储的方式而已:innoDB的默认数据结构是

聚集索引,而MyISAM是非聚集索引。

区别:

1、两个引擎的物理存储结构上 表的物理存储文件

(1)innoDB有两个文件,(表索引和数据是通过聚合方式存储的,所以叫聚集索引):

①test_innodb.frm------>Frame=表结构

②test_innobd.ibd------->innodb data=(表索引 + 数据)

(2)myisam有三个文件,(表索引和数据不是通过聚合方式存储的,分开存储):

①test_myisam.frm------>Frame=表结构

②test_myisam.MYD-------> MyISAM Data=表数据

③test_myisam.MYI-------> MyISAM Index=表索引

2、数据的检索对比

(1)聚集索引

①表的数据行都存放在索引树的叶子结点中

②索引和数据保存在同一个BTree中。因此从聚集索引中获取数据通常比在非聚集索引中查找要快。

(2)非聚集索引

①叶子节点保存的实际上是指向存放数据块的指针

②非聚集索引需要先查询一遍索引文件,得到索引,根据索引获取数据。

--------------------------------------mysql---------------------------------------

一、char,varchar的区别是什么?适用场景。

1、char存储定长的字符串,比如char(M),存储M个字符。

2、varchar存储变长字符串,它比char更灵活。

3、使用场景:对于定长或者短字符串,使用char更好,不容易产生内存碎片。

二、什么是触发器,MySQL中都有哪些触发器?

触发器是特殊的存储过程,当触发某个事件时,自动执行这些代码。在MySQL数据库中有如下六种触发器:

1、Before Insert

2、After Insert

3、Before Update

4、After Update

5、Before Delete

6、After Delete

before/after:触发器是在增删改之前执行,还是之后执行

delete/insert/update:触发器由哪些行为触发(增、删、改)

on 表名:触发器监视哪张表的(增、删、改)操作

触发SQL代码块:执行触发器包含的SQL语句

创建一个触发器的sql代码:

create trigger trigger_name
trigger_time
trigger_event on tbl_name
for each row
trigger_stmt

三、MySQL有哪些数据类型?

1、整数类型:bit,bool,tiny int,small int,medium int,int、big int

2、浮点数类型:float,double,decimal

3、字符串类型:char,varchar,tiny text,text,medium text,longtext,tiny blob,medium blob,long blob

4、日期类型:date,datetime,timestamp,time,year

使用注意事项:

(1)使用char或者varchar的时候,注意char会去掉字符串末尾的空格。

(2)使用text或者blob的时候,注意定期清理碎片空间,使用OPTIMIZE TABLE命令。

(3)浮点数会造成精度丢失,尽量使用decimal。

四、请你说一下MySQL是如何执行一条SQL的?具体步骤有哪些?

1、客户端请求

2、连接器(身份验证,权限grant)

3、查询缓存(如果缓存命中则直接返回)

4、分析器(对SQL进行词法分析和语法分析操作)

5、优化器(主要对执行的sql优化选择最优的执行方案方法)

6、执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)

7、去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)

五、请你说一下MySQL的四种索引类型?

1、FULLTEXT: 即为全文搜索。即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。

2、HASH :由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。 HASH索引可以一次定位,不需要像树形索引那样逐层查找, 因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

3、BTREE :BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

4、RTREE :RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。 相对于BTREE,RTREE的优势在于范围查找。

六、请你解释一下MySQL的MVCC?

MVCC是多版本并发控制的意思, 是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。用

于实现提交读和可重复读这两种隔离级别。

MVCC是通过保存数据在某个时间点的快照来实现该机制,其在每行记录后面保存两个隐藏的列。

分别保存这个行的创建版本号和删除版本号,然后InnoDB的MVCC使用到的快照存储在Undo的日

志中。该日志通过回滚指针将一个数据行的所有快照连接起来。

 参考资料数据库中的MVCC--多版本并发控制-CSDN博客。

七、InnoDB和MyISAM存储引擎的区别?

1、InnoDB: 优点:支持事务,外键,行级锁(甚至间隙锁),MVCC,并发量较大,适合大量 update。 缺点:不适合大量的 select。

2、MyISAM: 优点:查询数据相对较快,适合大量的 select,可以全文索引。存储容量256T比InnoDB大。 缺点:不支持事务,不支持外键,并发量较小,不适合大量 update。

八、MySQL为什么要有回滚机制?

1、能够在发生错误或者用户执行 ROLLBACK 时提供回滚相关的信息

2、 在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,能够立刻通

过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘

上,是我们需要先写日志后写数据库的主要原因。

你可能感兴趣的:(数据库,数据库,面试)