数据库面试题

1.数据库隔离等级

1.脏读:事务A读取到了事务B未提交的数据

2.不可重复读:两次查询结果不一致,因为两次查询中间有另外一个事务往里面更新了数据,不可重复读和脏读的区别:脏读读到的是一位未提交的数据,不可重复读读到的是前一个事务提交的数据,解决不可重复读就是多读几次,以最后一次为准,或者锁行

3.幻读:幻读和不可重复读都是读取另外一个已经提交的事务,但是不可重复读一般是发生在update时,数据被修改,幻读发生在insert或者delete时,数据会多出来一条,解决幻读可以锁表

隔离等级:读未提交、读已提交、可重复读、可序列化

2.事务特性ACID

事务是数据库执行的最小单元,要么全都执行,要么全都不执行

1.原子性Atomicity:一个操作,要么全部成功,要么全部失败,如果失败,就回滚

2.一致性Consistency:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的

3.隔离性Isolation:并发访问数据库时,各个事务之间互不干扰

4.持久性Durability:事务被提交后,改变是永久的,和断电宕机没有关系

3.数据库引擎

mysql有两种数据库引擎:myisam和innodb

区别:

1.innodb支持事务,myisam不支持

2.innodb是聚簇索引,myisam是非聚簇索引

两种引擎所使用的索引的数据结构都是B+树!

4.索引相关

4.1.什么是索引

索引就相当于目录

4.2索引优缺点

优点就是查询更快,缺点就是空间上需要占用物理空间,索引文件是单独的文件,时间上当数据内容发生更改时,索引也要改,增删改的效率会降低

4.3有哪些索引类型

1.主键索引:索引列中的值必须是唯一的,不允许有空值。
2.普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
3.唯一索引:索引列中的值必须是唯一的,但是允许为空值。
4.全文索引:只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。
5.组合索引:组合索引的使用,需要遵循最左前缀匹配原则(最左匹配原则)。只有在查询条件中使用了创建索引的第一个字段,索引才会被使用

4.4如何创建、删除索引

1.建表时

CREATE TABLE user_index(
#建立主键索引并设置自增
id INT auto_increment PRIMARY KEY, 
first_name VARCHAR(16),
last_name VARCHAR(16),
id_card VARCHAR(18),
information text,
#建立联合索引
KEY sname (first_name,last_name),
#建立外键
UNIQUE KEY id_card (id_card),
#建立全文索引
FULLTEXT KEY information (information)
)

2.alter语句

#建立联合索引
ALTER TABLE user_index ADD INDEX sname (first_name,last_name)
#建立外键
ALTER TABLE user_index ADD UNIQUE KEY  id_card (id_card)
#建立全文索引
ALTER TABLE user_index ADD FULLTEXT KEY  information (information)

3.create index语句

#建立普通索引
CREATE INDEX sname on user_index (first_name,last_name)
#建立外键
CREATE UNIQUE INDEX id_card  on user_index (id_card)

4.删除索引

ALTER TABLE user_index DROP KEY sname
ALTER TABLE user_index DROP KEY id_card
ALTER TABLE user_index DROP KEY information
#先取消自增再删除主键索引
ALTER TABLE user_index MODIFY id int,DROP PRIMARY KEY

 4.5索引的数据结构

1.Hash表:Hash表在等值查询时效率很高,时间复杂度为O(1);但是不支持范围快速查找,范围查找时还是只能通过扫描全表方式。
2.二叉搜索树(BST树):左子节点值比当前值小,右子节点值比当前值大,时间复杂度为O(logn),但是对根节点的值选取要求比较高,如果值越来越小或者越来越大,就会变成一颗斜树,时间复杂度退化为O(n)。
3.平衡二叉树(AVL树):拥有BST特点,同时保证了左子树和右子树的高度不会相差太大,也就是保证了查询时间复杂度不会退化为O(n),但是每次插入需要通过左旋/右旋来保持平衡,同时也不支持范围查找。
4.B树:B树其实是一种改造的平衡二叉树,由于访问平衡二叉树时,树的高度每向下一层,就会产生一次磁盘IO,磁盘IO是非常耗时间的,因此为了减少磁盘IO,需要降低树的高度,在树的每一层上由两个节点增加为多个节点。但是B树也不支持范围查找。
5.B+树:B+树是改造的B树
B数和B+树的区别:mysql用的b+树
1.B树内部节点可以存索引和值,B+树只有叶子结点可以存值
2.B树叶子结点不相连,B+树叶子结点有一条链表相连
3.查询速度上,B树越靠近根节点,查的越快,B+树每次查找速度都相同,因为都需要从根节点到叶子结点,但是B+树可以通过链表支持范围查找

5.数据库有哪些类型

关系型数据库:mysql oracle 有事务保证,但是局限于特定的结构

非关系型数据库:redis(键值存储) hbase(列存储,一个键多个列)便捷,但是没有事务保证

6.三范式理论

第一范式:所有属性不可再分割

举例(反例):

有一张Student表,字段为id,(first name, last name),age,class,firstname和Lastname在同一个字段里,违背了不可拆分的原则

第二范式:每个非主属性都完全依赖于主属性

举例(反例):

有一张课程选课表,字段为学号,姓名,课程名称,学分,成绩

关键字为组合关键字(学号,课程名称),因为存在如下决定关系:

(学号,课程名称)->(姓名,学分,成绩)

这里学分只依赖于部分主关键字,违背了第二范式

可以修改为三张表

1:学号 姓名

表2:课程名称 学分

表3:学号 课程名称 成绩

第三范式:非主属性必须依赖于主属性,而不能依赖于其他属性

举例(反例):

有一张表Student,字段为(学号,姓名,所在学院,学院地点)

关键字为学号,但是存在非关键字学院地点依赖于所在学院,传递依赖于学号,违背了第三范式

可以修改为两张表

1:学号 姓名 所在学院

2:学院 学院地点

7.SQL执行顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值