数据库八股文背诵版

临近秋招,整理了一下前段时间找实习时被问过的高频八股(多为互联网大厂)+一些自己的补充。这些只是最基础最基础必须全文背诵的八股!答案很简略,基本都是自己的理解,如有勘误还请指出,虚心改正。

一、什么是数据库事务?

定义:事务是数据库执行的逻辑单位,包含一系列读写操作,整个单元不可分割,是原子性的。

特性:ACID,即原子性、一致性、隔离性、持久性(一致性是指,事务执行前后,数据库都必须处于一致的状态,如转账)

二、事务的隔离级别?(蚂蚁)

脏读:一个事务修改了数据还没提交,另一个事务就已经读到了修改后的数据

幻读:某一次select的结果无法支撑后续对此结果的操作(如select某记录不存在,但接下来insert该记录时又已存在该记录无法插入)

不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

脏读不可重复读幻读
读未提交 Read Uncommitted
读已提交 Read Committedx
可重复读 Repeatable Readxx
可串行化 Serializablexxx

三、SQL约束有哪些?(美团)

主键约束:PRIMARY KEY

外键约束:FOREIGN KEY

唯一约束:UNIQUE

非空约束:NOT NULL

默认约束:DEFAULT

四、SQL分类?(招商银行)

(DMCQ)

DDL:数据定义语言,用于库和表的操作

DML:数据操纵语言,用于表内记录的操作

DCL:数据控制语言,用于用户登录、权限

DQL:数据查询语言,用于数据查询

五、SQL三个删除操作的区别?(招商银行)

  1. drop:删除数据库和表/视图/触发器(数据定义语言DDL)

    drop database db;
    drop table tb;
  2. delete:删除表中字段(属于DML,后面可添加条件)

    delete from tb where id=1;
  3. truncate:删除表中所有字段(属于DDL,后面不可添加条件)

    truncate table tb;

※ DDL语句不会记录日志

六、in和exists的区别?

in:先查询内表,再将内表与外表作笛卡尔积,进行匹配(外表用索引)----> 因此外表大的用in

exists:先对外表循环,每次遍历去内表中查询匹配(内表用索引)----> 因此内表大的用exists

七、几个join的区别?(蚂蚁)

join默认是inner join

八、count和sum的区别?以及count(主键)、count(字段)、count(1)、count(*)的区别?

count是累计,求行的个数;sum是求和。

count(主键):InnoDB会遍历整张表,取出每一行的主键id值,返回服务层,服务层按行累加(null不计数,不用判断null)

count(字段):取值字段,返回服务层;若没有not null约束,则服务层会先判断是否为null再计数;若有则不会判断

count(1):不取值,直接返回1给服务层,服务层对所有行统计,包括null

count(*):InnoDB做了专门优化,不取值,直接累加。

因此效率:count(*) > count(1) > count(主键) > count(字段)

九、简要介绍常用数据库引擎?(招商银行)

  1. InnoDB:聚集索引。支持事务、行级锁、外键

    表文件为xxx.ibd,包括表结构、数据、索引

  2. MyISAM:非聚集索引。不支持事务、行级锁、外键;访问速度快

    存储文件格式:xxx.sdi->表结构;xxx.MYD->数据;xxx.MYI->索引

  3. Memory:表数据存储在内存中,只作临时表或缓存使用;hash索引

    文件只有xxx.sdi

十、数据库查询过程?

客户端TCP连接->查缓存->语法分析器->优化器(选择索引)->执行器

十一、数据库的存储过程是什么?

我们常用的操作数据库sql语句在执行时要先编译再执行,而存储过程则是预编译的sql语句,可直接调用(CALL)

十二、数据库常用范式?

  1. 1NF:强调列的原子性,即数据库表的每一列都是不可分割的原子数据项。

  2. 2NF:非主键列必须完全依赖于主键,而不能只依赖于主键的一部分

  3. 3NF:任何非主属性不依赖于其它非主属性

  4. BCNF:不存在主属性对候选码的部分与传递函数依赖

十三、数据库索引?

定义:类似书的目录,用于快速获取数据。是一个文件,常用B+树存储。

存储结构:B+树(InnoDB、MyISAM、Memory)、hash(Memory,只能精确匹配,且无法范围查询)、R-tree(MyISAM特有的空间索引)、Full-text(InnoDB、MyISAM,倒排索引,用属性值定位记录)

索引分类:

  1. 常规索引:INDEX

  2. 主键索引:PRIMARY

  3. 唯一索引:UNIQUE

  4. 全文索引:FULLTEXT

十四、聚集索引?

InnoDB中索引存储形式:聚集索引二级索引。聚集索引是由主键创建的索引,叶节点挂的是行数据;而二级索引叶节点挂的是主键。

如果select的字段不是主键,就需要回表查询:先通过二级索引定位主键值,再通过聚集索引定位行数据。

十五、MySQL中用户密码丢了怎么办?

  1. 如果是普通用户密码丢失,直接root用户登录修改密码即可。

  2. 如果是root用户密码丢失,可启动安全模式,跳过密码验证启动MySQL,然后重置密码。

十六、主键、外键、超键、候选键的区别?

  1. 超键:可唯一标识,但可能存在一些多余的属性

  2. 候选键:可唯一确定一个实体,是一个或多个属性的组合,没有多余的属性存在,是最小的超键

  3. 主键:从候选键中,选中用来作为唯一标识的属性或属性组

  4. 外键:关联另一张表,用于保持数据一致性

超键≥候选键≥主键

十七、数据库的缓存有什么用?

缓存数据存储在内存中,减少磁盘I/O开销。绝大部分场景是查询,提高响应速度。

十八、如何对数据库优化?(蚂蚁)

  1. 调整数据结构,合理建立索引

  2. 优化服务器内存分配

  3. 优化硬盘I/O

  4. ☆优化SQL语句:

    1. insert优化:

      a. 批量插入(一条insert插入500~1000条数据)

      b. 手动提交事务

      c. 按主键顺序插入

      d. 大批量插入数据时用load不用insert

    2. 主键优化:

      a. 降低主键长度

      b. 插入数据时顺序插入,选择AUTO_INCREMENT自增主键

      c. 不使用UUID或其他自然主键

      d. 避免修改主键

    3. order by、group by、limit优化:使用覆盖索引

    4. count优化:效率count(*) > count(1) > count(主键) > count(字段)

    5. update优化:条件有索引时才会加行锁,否则加表锁,因此避免升级表锁

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海苔小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值