临近秋招,整理了一下前段时间找实习时被问过的高频八股(多为互联网大厂)+一些自己的补充。这些只是最基础最基础必须全文背诵的八股!答案很简略,基本都是自己的理解,如有勘误还请指出,虚心改正。
一、什么是数据库事务?
定义:事务是数据库执行的逻辑单位,包含一系列读写操作,整个单元不可分割,是原子性的。
特性:ACID,即原子性、一致性、隔离性、持久性(一致性是指,事务执行前后,数据库都必须处于一致的状态,如转账)
二、事务的隔离级别?(蚂蚁)
脏读:一个事务修改了数据还没提交,另一个事务就已经读到了修改后的数据
幻读:某一次select的结果无法支撑后续对此结果的操作(如select某记录不存在,但接下来insert该记录时又已存在该记录无法插入)
不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 Read Uncommitted | √ | √ | √ |
读已提交 Read Committed | x | √ | √ |
可重复读 Repeatable Read | x | x | √ |
可串行化 Serializable | x | x | x |
三、SQL约束有哪些?(美团)
主键约束:PRIMARY KEY
外键约束:FOREIGN KEY
唯一约束:UNIQUE
非空约束:NOT NULL
默认约束:DEFAULT
四、SQL分类?(招商银行)
(DMCQ)
DDL:数据定义语言,用于库和表的操作
DML:数据操纵语言,用于表内记录的操作
DCL:数据控制语言,用于用户登录、权限
DQL:数据查询语言,用于数据查询
五、SQL三个删除操作的区别?(招商银行)
-
drop:删除数据库和表/视图/触发器(数据定义语言DDL)
drop database db; drop table tb;
-
delete:删除表中字段(属于DML,后面可添加条件)
delete from tb where id=1;
-
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(字段)
九、简要介绍常用数据库引擎?(招商银行)
-
InnoDB:聚集索引。支持事务、行级锁、外键
表文件为xxx.ibd,包括表结构、数据、索引
-
MyISAM:非聚集索引。不支持事务、行级锁、外键;访问速度快
存储文件格式:xxx.sdi->表结构;xxx.MYD->数据;xxx.MYI->索引
-
Memory:表数据存储在内存中,只作临时表或缓存使用;hash索引
文件只有xxx.sdi
十、数据库查询过程?
客户端TCP连接->查缓存->语法分析器->优化器(选择索引)->执行器
十一、数据库的存储过程是什么?
我们常用的操作数据库sql语句在执行时要先编译再执行,而存储过程则是预编译的sql语句,可直接调用(CALL)
十二、数据库常用范式?
-
1NF:强调列的原子性,即数据库表的每一列都是不可分割的原子数据项。
-
2NF:非主键列必须完全依赖于主键,而不能只依赖于主键的一部分
-
3NF:任何非主属性不依赖于其它非主属性
-
BCNF:不存在主属性对候选码的部分与传递函数依赖
十三、数据库索引?
定义:类似书的目录,用于快速获取数据。是一个文件,常用B+树存储。
存储结构:B+树(InnoDB、MyISAM、Memory)、hash(Memory,只能精确匹配,且无法范围查询)、R-tree(MyISAM特有的空间索引)、Full-text(InnoDB、MyISAM,倒排索引,用属性值定位记录)
索引分类:
-
常规索引:INDEX
-
主键索引:PRIMARY
-
唯一索引:UNIQUE
-
全文索引:FULLTEXT
十四、聚集索引?
InnoDB中索引存储形式:聚集索引和二级索引。聚集索引是由主键创建的索引,叶节点挂的是行数据;而二级索引叶节点挂的是主键。
如果select的字段不是主键,就需要回表查询:先通过二级索引定位主键值,再通过聚集索引定位行数据。
十五、MySQL中用户密码丢了怎么办?
-
如果是普通用户密码丢失,直接root用户登录修改密码即可。
-
如果是root用户密码丢失,可启动安全模式,跳过密码验证启动MySQL,然后重置密码。
十六、主键、外键、超键、候选键的区别?
-
超键:可唯一标识,但可能存在一些多余的属性
-
候选键:可唯一确定一个实体,是一个或多个属性的组合,没有多余的属性存在,是最小的超键
-
主键:从候选键中,选中用来作为唯一标识的属性或属性组
-
外键:关联另一张表,用于保持数据一致性
超键≥候选键≥主键
十七、数据库的缓存有什么用?
缓存数据存储在内存中,减少磁盘I/O开销。绝大部分场景是查询,提高响应速度。
十八、如何对数据库优化?(蚂蚁)
-
调整数据结构,合理建立索引
-
优化服务器内存分配
-
优化硬盘I/O
-
☆优化SQL语句:
-
insert优化:
a. 批量插入(一条insert插入500~1000条数据)
b. 手动提交事务
c. 按主键顺序插入
d. 大批量插入数据时用load不用insert
-
主键优化:
a. 降低主键长度
b. 插入数据时顺序插入,选择AUTO_INCREMENT自增主键
c. 不使用UUID或其他自然主键
d. 避免修改主键
-
order by、group by、limit优化:使用覆盖索引
-
count优化:效率count(*) > count(1) > count(主键) > count(字段)
-
update优化:条件有索引时才会加行锁,否则加表锁,因此避免升级表锁
-