数据库面试题

1.三范式

1nf: 单列属性不可再分

2nf: 每个字段依赖于全部主键而非部分主键(对于非组合主键来说, 主要满足1nf就满足2nf)

3nf: 消除传递依赖, 非主键以外的字段要互不依赖

2.视图

视图不存数据, 数据还是存在表里, 只是方便程序员, 不提高查询效率

3.drop、delete与truncate

drop和truncate都是ddl, 不能回滚, drop删表结构, truncate只删数据

drop是dml, 可回滚

速度上drop> truncate > delete

4.索引是什么

加快数据库的检索速度, 降低了插入、删除、修改等维护任务的速度(要更新索引), 要占空间

经常select, 而且数据量大 => 建索引

经常update, insert, delete, 数据量小 => 不建索引

  • 唯一索引:唯一索引不允许两行具有相同的索引值
  • 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
  • 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
  • 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个

5.事务的ACID

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

4个隔离级别:

  1. Serializable【可避免脏读,不可重复读,虚读】
  2. Repeatable read【可避免脏读,不可重复读】
  3. Read committed【可避免脏读】
  4. Read uncommitted【级别最低,什么都避免不了】

脏读:一个事务读取到另外一个事务未提交的数据

不可重复读:一个事务读取到另外一个事务已经提交的数据,也就是说一个事务可以看到其他事务所做的修改

6. select* 和limit

为什么select*慢

1.经常会有一些不需要的字段

2.用select*如果表的schema改了数据会乱

InnoDB为什么limit的offset大了之后, 效率会很低

因为InnoDB如果通过二级索引(辅助索引)去查找, 会先找到主键, 再根据主键索引查找数据行, 多一步找主键的过程;

如何优化limit的速度:

因为select先找主键, 再找数据, 所以优化方法就是, 在查询的时候, 使用inner join来找到主键, 然后再用limit, 这样就不用找主键了

mysql> select a.* from member as a inner join (select id from member where gender=1 limit 300000,1) as b on a.id=b.id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值